MongoDB$lookup或$graphLookup递归聚合,并使用条件停止查找
我试图使用$lookup或graphLookup聚合来搜索同一集合中的一些相关文档,但我希望在满足条件后停止查找。 下面是我想做的一个例子: 收集中的文档示例:MongoDB$lookup或$graphLookup递归聚合,并使用条件停止查找,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我试图使用$lookup或graphLookup聚合来搜索同一集合中的一些相关文档,但我希望在满足条件后停止查找。 下面是我想做的一个例子: 收集中的文档示例: { “_id”:1, “姓名”:“鲍勃”, “idNumber”:“111111-1”, “条件域”:正确, “已启用”:false }, { “_id”:2, “姓名”:“鲍勃”, “idNumber”:“111111-1”, “条件字段”:false, “已启用”:false }, { “_id”:3, “姓名”:“鲍勃”, “id
{
“_id”:1,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
},
{
“_id”:2,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件字段”:false,
“已启用”:false
},
{
“_id”:3,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
},
{
“_id”:4,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
},
{
“_id”:5,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:真
}
我想查询启用
字段为真
的单个文档,然后按升序查找启用
字段为假
的所有其他文档,名称
和idNumber
字段与启用的文档匹配。但我想在查找到conditionField
等于false
的文档后停止查找,并忽略其余部分
这是我现在的问题:
[
{
“$match”:{
“已启用”:true
}
}, {
“$lookup”:{
“from”:“collection”,
“让我们:{
“name”:“$name”,
“idNumber”:“$idNumber”
},
“管道”:[
{
“$match”:{
“$expr”:{
“$and”:[
{'$eq':['$name','$$name']},
{'$eq':['$idNumber','$$idNumber']},
{'$eq':['$enabled',false]}
]
}
}
},
{'$sort':{''u id':-1}
],
“as”:“relatedDocs”
}
}
]
此查询返回返回所有相关文档,如下所示:
{
“_id”:5,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“启用”:正确,
“相关文件”:[
{
“_id”:4,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
},
{
“_id”:3,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
},
{
“_id”:2,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件字段”:false,
“已启用”:false
},
{
“_id”:1,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
}
]
}
但我真正想要的是,一旦发现“conditionField”等于“false”的文档,就停止查找,并忽略其余部分。所以我想要的结果是:
{
“_id”:5,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“启用”:正确,
“相关文件”:[
{
“_id”:4,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
},
{
“_id”:3,
“姓名”:“鲍勃”,
“idNumber”:“111111-1”,
“条件域”:正确,
“已启用”:false
}
]
}
您可以在查询后添加新阶段
要迭代$reduce
数组,请检查相关文档的循环
是否为true,初始值中的条件字段
是否为状态
,然后使用true
返回concat数组,否则返回false$concatarray
您可以在查询后添加新阶段
要迭代$reduce
数组,请检查相关文档的循环
是否为true,初始值中的条件字段
是否为状态
,然后使用true
返回concat数组,否则返回false$concatarray
{
$addFields: {
relatedDocs: {
$reduce: {
input: "$relatedDocs",
initialValue: { result: [], status: true },
in: {
$cond: [
{
$and: [
{ $eq: ["$$this.conditionField", true] },
{ $eq: ["$$value.status", true] }
]
},
{
result: { $concatArrays: ["$$value.result", ["$$this"]] },
status: "$$value.status"
},
{
result: "$$value.result",
status: false
}
]
}
}
}
}
}