我正在尝试获取包含作者信息的书籍列表。
某些用户已被删除,因此他们在数据库中不再有文档,因此,他们的信息为空。
如果他们的创作者仍然存在,我只想拉书。
这是我的代码:
Book.find({_creator:{$ne:null}}).populate(
{
path: '_creator',
match: { _id: { $ne: null }}
})
.exec(function (err,books) {
if(err) throw err;
if(books) {
res.send(books)
}
})
这就是它的回报:
[
{
"_id":"55d98e6a4de71010099c59eb",
"dateOfCreation":"2015-08-23T09:12:10.095Z",
"_creator":null,
"__v":0,
"coverUrl":"cover14403211323926quv.png",
"description":"asdasd",
"name":"asdasd"
}
]
请注意_creator字段为空。 这是为什么?
答案 0 :(得分:7)
您需要了解代码的执行顺序:
mongoose从数据库{_creator:{$ne:null}}
获取所有书籍。 Mongo只查看books集合中的引用来确定要返回的文档。您的图书仍然引用了作者,mongo将不会注意到作者集合中没有匹配的作者,因此您的图书已加载。
mongoose正在填充所有返回的结果:因此它从Authors集合中加载作者并用真实对象替换引用。对于您的图书,它找不到匹配的作者,因此它会将null
放在那里。
这就是为什么你最终得到你的结果列表。
Mongo不支持联接 - 因此您无法执行包含来自多个集合的数据的查询。 Populate只是一种用真实数据替换结果列表中的引用的方法,您永远不能将填充数据用作where子句的一部分。
要解决您的问题,您可以:
AuthorSchema.post('remove', function(doc) {// update your books here});