Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB$lookup或$graphLookup递归聚合,并使用条件停止查找_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

MongoDB$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

我试图使用$lookup或graphLookup聚合来搜索同一集合中的一些相关文档,但我希望在满足条件后停止查找。 下面是我想做的一个例子:

收集中的文档示例:

{
“_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
    ,然后使用
    $concatarray
    返回concat数组,否则返回false

您可以在查询后添加新阶段

  • $reduce
    要迭代
    相关文档的循环
    数组,请检查
    条件字段
    是否为true,初始值中的
    状态
    是否为
    true
    ,然后使用
    $concatarray
    返回concat数组,否则返回false

  {
    $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
              }
            ]
          }
        }
      }
    }
  }