node.js – 仅当ref不为null时才尝试填充mongoose – 不工作

前端之家收集整理的这篇文章主要介绍了node.js – 仅当ref不为null时才尝试填充mongoose – 不工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试获取包含作者信息的书籍清单.

有些用户已被删除,因此他们在数据库中不再有文档,因此,他们的信息为空.

如果他们的创作者仍然存在,我只想拉书.

这是我的代码

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上使用挂钩来执行此操作.

AuthorSchema.post(‘删除’,功能(doc){//在此更新您的书籍});

原文链接:https://www.f2er.com/nodejs/241220.html

猜你在找的Node.js相关文章