首页 > 解决方案 > 将 Mongo DB 数组元素与自身进行比较,以在文档中查找特定字段中具有不同值的数组

问题描述

我有一个 mongo 集合 QT_STG 如下:

Document #1
{
    "_id" : ObjectId("603f82844cc37e190862e0e6"),
    "saleid"   : "M5111161000",
    "parentID" : "1",
    "distid"   : "123",
    "gracePeriod" : "12"
    "lineDetails" : [ 
        {
            "id" : "1",
            "endDate" : "3/26/2022"
        },
        {
            "id" : "2",
            "endDate" : "3/26/2022"
        },


     ]
}
Document #2
{
    "_id" : ObjectId("603f82844cc37e190862e0e6"),
    "saleid"   : "M5111161000",
    "parentID" : "1",
    "distid"   : "123",
    "gracePeriod" : "12"
    "lineDetails" : [ 
        {
            "id" : "1",
            "endDate" : "3/24/2022"
       },
        {
            "id" : "2",
            "endDate" : "3/22/2022"
        },
        {
            "id" : "3",
            "endDate" : "4/22/2022"
        }
     ]
}

我应该能够选择 linedetails 大小大于“2”并且在“lineDetails”数组中具有不同“endDate”的文档。

在上面的示例中,只有 Document#2 必须被选中。有人可以在这里帮助我。

标签: arraysmongodbcompareaggregate

解决方案


为@Mohammad Naimi 解决方案添加了更多条件并得到了结果。

 db.quoting_staging.aggregate(
    [
      {
        "$addFields": {
          "numLineDetails": {
            "$size": { "$ifNull": [ "$lineDetails", [] ] }
          }
        }
      }
    , {
        '$match': {
          'numLineDetails': {
            '$gt': 2
          }
        }
      },
      {
        '$unwind': {
          'path': '$lineDetails'
        }
      }, 
      {
        '$group': {
          '_id': {
            'id': '$_id'
          }, 
          'sid': { "$first": "$$ROOT.sid" },
          'arr': {
            '$addToSet': '$$ROOT.lineDetails.endDate'
          },
          'initialArrSize':{ "$first": "$$ROOT.numLineDetails" }
        }
      },
        {
        "$addFields": {
          "distinctArrSize": {
            "$size": { "$ifNull": [ "$arr", [] ] }
          }
        }
      },
      {
        '$project': {
          'arr': 1, 
          '_id': 1,
          'sid': 1,
          'distinctArrSize':1,
          'initialArrSize':1
        }
      }
      , {
        '$match': {$expr: {$eq: ["$distinctArrSize", "$initialArrSize"]}}
      }
    ])

比较初始的 'linedetails' 大小 'arr' 大小帮助我识别出在其 linedetails 中具有唯一结束日期的文档。


推荐阅读