【问题标题】:Filter documents with invalid reference in Mongoose populate在 Mongoose 填充中过滤具有无效引用的文档
【发布时间】:2017-05-19 17:06:37
【问题描述】:

我有三个集合 A、B 和 C。

我想用嵌套填充

A.findById(id).populate({
  path: 'B_docs',
  populate: {
    path: 'C_doc'
  }
})

问题是C集合中的文档可能不存在,所以我最终得到了来自A的文档和来自B的多个文档,但是B中的一些文档有参考C 中的文档可能已被删除。

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

我当然可以使用

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为使用内置的填充功能是不可能的,因为猫鼬查询数据库并按以下顺序构建结果:

    1. 按 id 获取 A
    2. B_docs获取每个 B 文档的 id
    3. 从 B 文档的 C_doc 属性中按 id 获取每个 C 文档

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

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

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

    【讨论】:

    • 使用$project$filter 而不是.populate() 会不会出现性能问题?
    • 其实我也不知道。聚合使用更多的数据库资源,但很难说有多少,因为它取决于查询。你需要测量它。
    猜你喜欢
    • 2019-01-08
    • 2013-07-08
    • 1970-01-01
    • 2014-08-06
    • 2018-08-16
    • 2017-01-27
    • 1970-01-01
    • 2017-12-11
    • 2013-08-15
    相关资源
    最近更新 更多