Удалить дубликаты из массива без $ unwind - PullRequest
0 голосов
/ 04 ноября 2018

Используя агрегацию запросов, я хочу создать новый массив с помощью фильтра другого массива, чтобы отфильтрованный результат выполнялся в определенном поле предварительного массива. В этом случае я хочу фильтровать по полю " 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 голосов
/ 04 ноября 2018

Вы можете использовать ниже агрегации

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"] }
        }
      }
    }
  }}
])
...