在Mongoose中填充带有无效引用的文档

时间:2017-05-19 08:39:19

标签: javascript node.js mongodb mongoose mongoose-populate

我有三个集合A,B和C.

我想用

创建一个嵌套的填充
A.findById(id).populate({
  path: 'B_docs',
  populate: {
    path: 'C_doc'
  }
})

问题是C集合中的文档可能不存在,因此我最终得到了A中包含来自B的多个文档的文档,但是其中的一些文档B引用了C中可能已被删除的文档。

如何确保我只包含引用的B文档仍然存在的C个文档?

当然我可以使用

a_doc.b_docs.filter(b_doc => !!b.c_doc)

但我希望直接使用Mongoose删除这些文档(因为它们在我的上下文中无效)。

1 个答案:

答案 0 :(得分:0)

我认为使用内置的populate函数是不可能的,因为mongoose查询数据库并按以下顺序构建结果:

  1. 按ID
  2. 获取A.
  3. B_docs
  4. 中按ID获取每个B档位
  5. 从B个文档的C_doc属性
  6. 中按ID获取每个C文档

    当Mongoose发现C缺失时,所有B文档都已填充,如果Mongoose可以根据您的条件过滤文档,那么将在节点级别执行,因此您可以对提到的代码部分执行相同操作:

    a_doc.b_docs.filter(b_doc => !!b.c_doc)
    

    可能的解决方案可能是聚合,$project$filter应该是可能的