对应内容:#7 Dynamic Relations | Build a Complete App with GraphQL, Node.js, MongoDB and React.js
1 想要查询event的同时获得对应的用户Id?
query {
events {
title
creator {
_id
email
}
}
}
先修改Schema内容,添加最后两行使得可以在获取一方的同时获取对应的另外一方:
type Event {
_id: ID!
title: String!
description: String!
price: Float!
date: String!
+>creator: User
}
type User {
_id: ID!
email: String!
password: String
+>createEvents: [Event!]
}
但是这里要注意,以 Event
的 Model
举例,数据库里存的一直是外键——user的Id,从来没有存储整个User。
所以这样是可以的
query {
events {
title
creator {
_id
}
}
}
这样是不行的
query {
events {
title
creator {
email
}
}
}
所以要靠一些方法来进行join。比如 populate
方法。
events: () => {
return Event.find()
.populate("creator")
.then(events => {
return events.map(event => {
return {
...event._doc,
date: event.date.toISOString(),
creator: {
// 省略一些系统内建字段,比如_v
...event.creator._doc,
password: null
}
};
})
}).catch(err => {
throw err
});
},
这里采用的是populate(Web 填入;填充)
方法。上面采用event的"creator"字段作为populate的参数作为字符串传入,通过"creator"字段中的ref属性,来获取对应的user对象,并自动加入到event对象中。最终结果如下,成功。
在新版的graphQL中,不需要再对
_id
进行重写覆盖了,但是date还是需要
{
"data": {
"events": [
{
"title": "test title",
"creator": {
"_id": "604482754c6bd70d2453f3e0",
"email": "787552171@qq.com"
}
}
]
}
}
如果想继续嵌套获得呢?
query {
events {
title
creator {
_id
email
createEvents {
title
}
}
}
}
events: () => {
return Event.find()
.then(events => {
return events.map(event => {
return {
...event._doc,
date: event.date.toISOString(),
creator: getUserById(event.creator)
};
})
}).catch(err => {
throw err
});
},