在没有$ unwind

时间:2018-11-04 16:14:07

标签: mongodb mongodb-query aggregation-framework

使用查询聚合,我想通过另一个数组的过滤器创建一个新的数组,以便过滤后的结果将由初步数组的特定字段完成。 在这种情况下,我要按字段“ fieldName ”进行过滤。

我将一直想过滤掉最后一次发生的情况

示例: 我有一个文件:

{
"fullyQualifiedName" : "MongoDB",
"items" : [ 
    {
        "fieldName" : "_id",
        "fieldCount" : 7,
        "confidence_level" : 1,
        "fieldClassifications" : [ 
            "LineageGuid"
        ],
    }, 
    {
        "fieldName" : "_id",
        "fieldCount" : 7,
        "fieldClassifications" : [ 
            {
                "classificationName" : "LineageGuid",
            }
        ]
    }, 
    {
        "fieldName" : "details",
        "fieldCount" : 7,
    }, 
    {
        "fieldName" : "state",
        "fieldCount" : 7,
    }
]

}

我想创建一个新的数组,例如:

"items" : [ 
    {
        "fieldName" : "_id",
        "fieldCount" : 7,
        "confidence_level" : 1,
        "fieldClassifications" : [ 
            "LineageGuid"
        ],
    }, 
    {
        "fieldName" : "details",
        "fieldCount" : 7,
    }, 
    {
        "fieldName" : "state",
        "fieldCount" : 7,
    }
]

简单的解决方案是再次 $ unwind $ group ,但是由于性能问题,我不能这样做。 我正在使用MongoDB 3.4

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

db.collection.aggregate([
  { "$addFields": {
    "items": {
      "$map": {
        "input": {
          "$setUnion": [
            { "$map": {
              "input": "$items",
              "in": { "$indexOfArray": ["$items.fieldName", "$$this.fieldName"] }
            }}
          ]
        },
        "as": "i",
        "in": {
          "fieldName": { "$arrayElemAt": ["$items.fieldName", "$$i"] },
          "fieldCount": { "$arrayElemAt": ["$items.fieldCount", "$$i"] },
          "confidence_level": { "$arrayElemAt": ["$items.confidence_level", "$$i"] },
          "fieldClassifications": { "$arrayElemAt": ["$items.fieldClassifications", "$$i"] }
        }
      }
    }
  }}
])