在 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 查询数据库并按以下顺序构建结果:
- 通过 id 获取 A
- 通过 id 从
B_docs
获取每个 B 文档
- 通过 id 从 B 文档的
C_doc
属性中获取每个 C 文档
当 Mongoose 发现 C 丢失时,所有 B 文档都已填充,如果 Mongoose 可以根据您的条件过滤文档,那将在节点级别执行,因此您可以对上述内容执行相同的操作代码部分:
a_doc.b_docs.filter(b_doc => !!b.c_doc)
一个可能的解决方案是聚合,$project
和 $filter
应该是可能的
我有三个集合 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 查询数据库并按以下顺序构建结果:
- 通过 id 获取 A
- 通过 id 从
B_docs
获取每个 B 文档
- 通过 id 从 B 文档的
C_doc
属性中获取每个 C 文档
当 Mongoose 发现 C 丢失时,所有 B 文档都已填充,如果 Mongoose 可以根据您的条件过滤文档,那将在节点级别执行,因此您可以对上述内容执行相同的操作代码部分:
a_doc.b_docs.filter(b_doc => !!b.c_doc)
一个可能的解决方案是聚合,$project
和 $filter
应该是可能的