仅当ref不为null时才尝试填充mongoose - 不工作

时间:2015-08-23 09:48:50

标签: node.js mongodb 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字段为空。 这是为什么?

1 个答案:

答案 0 :(得分:7)

您需要了解代码的执行顺序:

  1. mongoose从数据库{_creator:{$ne:null}}获取所有书籍。 Mongo只查看books集合中的引用来确定要返回的文档。您的图书仍然引用了作者,mongo将不会注意到作者集合中没有匹配的作者,因此您的图书已加载。

  2. mongoose正在填充所有返回的结果:因此它从Authors集合中加载作者并用真实对象替换引用。对于您的图书,它找不到匹配的作者,因此它会将null放在那里。

  3. 这就是为什么你最终得到你的结果列表。

    Mongo不支持联接 - 因此您无法执行包含来自多个集合的数据的查询。 Populate只是一种用真实数据替换结果列表中的引用的方法,您永远不能将填充数据用作where子句的一部分。

    要解决您的问题,您可以:

    • 在JS代码中过滤您的最终结果列表,例如使用lodash库的_.filter。
    • 更新所有图书,并在删除作者时删除参考。您可以在Author-Schema上使用钩子来执行此操作。

    AuthorSchema.post('remove', function(doc) {// update your books here});