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){//在此更新您的书籍});

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...