我正在尝试获取包含作者信息的书籍清单.
有些用户已被删除,因此他们在数据库中不再有文档,因此,他们的信息为空.
如果他们的创作者仍然存在,我只想拉书.
这是我的代码:
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字段为空.
这是为什么?
解决方法
您需要了解代码的执行顺序:
> mongoose从{_creator:{$ne:null}}获取数据库中的所有书籍. Mongo只查看books集合中的引用来确定要返回的文档.您的图书仍然引用了作者,而且mongo不会注意到作者集合中没有匹配的作者,因此您的图书已加载.
> mongoose填充所有返回的结果:因此它从Authors集合中加载作者并用真实对象替换引用.对于你的书,它没有找到匹配的作者,因此它将null放在那里.
这就是为什么你最终得到你的结果列表.
Mongo不支持联接 – 因此您无法执行包含来自多个集合的数据的查询. Populate只是用真实数据替换结果列表中的引用的一种方法,您永远不能使用填充数据作为where子句的一部分.
要解决您的问题,您可以:
>在JS代码中过滤您的最终结果列表,例如使用lodash库的_.filter.
>更新所有图书并删除作者时删除参考.您可以在Author-Schema上使用挂钩来执行此操作.