【问题标题】:MongoDB $lookup or $graphLookup aggregation recursively and stop the lookup with a conditionMongoDB $lookup 或 $graphLookup 递归聚合并使用条件停止查找
【发布时间】:2021-03-27 09:12:26
【问题描述】:

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

集合中的文档示例:

{
    "_id":1,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": true,
    "enabled": false
},
{
    "_id":2,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": false,
    "enabled": false
},
{
    "_id":3,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": true,
    "enabled": false
},
{
    "_id":4,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": true,
    "enabled": false
},
{
    "_id":5,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": true,
    "enabled": true
}

我要查询enabled字段为true的单个文档,然后按升序查找enabledfalsenameidNumberfields匹配的所有其他文档启用的文档。但是一旦找到conditionField等于false的文档,我想停止查找并忽略其余部分。

这是我现在的查询:

[
  {
    '$match': {
      'enabled': true
    }
  }, {
    '$lookup': {
      'from': 'collection', 
      'let': {
        'name': '$name', 
        'idNumber': '$idNumber'
      }, 
      'pipeline': [
        {
          '$match': {
            '$expr': {
              '$and': [
                {'$eq': ['$name', '$$name']}, 
                {'$eq': ['$idNumber', '$$idNumber'] }, 
                {'$eq': ['$enabled', false]}
              ]
            }
          }
        }, 
        {'$sort': {'_id': -1} }
      ], 
      'as': 'relatedDocs'
    }
  }
]

这个查询返回像这样返回所有相关文档:

{
    "_id":5,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": true,
    "enabled": true,
    "relatedDocs":[
      {
        "_id":4,
        "name":"Bob",
        "idNumber":"111111-1",
        "conditionField": true,
        "enabled": false
      },
      {
        "_id":3,
        "name":"Bob",
        "idNumber":"111111-1",
        "conditionField": true,
        "enabled": false
       },
       {
        "_id":2,
        "name":"Bob",
        "idNumber":"111111-1",
        "conditionField": false,
        "enabled": false
       },
       {
        "_id":1,
        "name":"Bob",
        "idNumber":"111111-1",
        "conditionField": true,
        "enabled": false
       }
    ]

}

但我真正想要的是在找到“conditionField”等于“false”的文档后停止查找并忽略其余部分。所以我要找的结果是这样的:

{
    "_id":5,
    "name":"Bob",
    "idNumber":"111111-1",
    "conditionField": true,
    "enabled": true,
    "relatedDocs":[
      {
        "_id":4,
        "name":"Bob",
        "idNumber":"111111-1",
        "conditionField": true,
        "enabled": false
      },
      {
        "_id":3,
        "name":"Bob",
        "idNumber":"111111-1",
        "conditionField": true,
        "enabled": false
       }
    ]

}

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

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

    • $reduce迭代relatedDocs数组的循环,检查条件如果conditionField为真且status初始值为true,则使用$concatArrays返回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
                  }
                ]
              }
            }
          }
        }
      }
    

    Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-02
      • 2021-02-22
      • 2019-10-25
      • 2017-02-16
      • 2022-01-05
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多