在 Mongoose 填充中过滤具有无效引用的文档

Filter documents with invalid reference in Mongoose populate

我有三个集合 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 删除这些文档(因为它们在我的上下文中无效)。

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

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

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

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

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