Как объединить два объекта на этапе проекта агрегации mongodb? - PullRequest
5 голосов
/ 23 сентября 2019

У меня был следующий массив структур в моем конвейере агрегации.Пробовал объединять объекты и операторы setUnion.

{ 
  combs:[
    [
      {
        name:"A",
        c_type:"A"
      },
      {
        type:"visual",
        severity:"Normal"
      }
    ],
    [
      {
        name:"B",
        c_type:"B"
      },
      {
        type:"visual",
        severity:"Normal"
      }
    ]
  ]
}

Я ожидаю, что следующие результаты приведут к некоторой статистике.Пожалуйста, помогите мне.

{ 
  combs:[
    {
      name:"A",
      c_type:"A",
      type:"visual",
      severity:"Normal"
    }
    {
      name:"B",
      c_type:"B",
      type:"visual",
      severity:"Normal"
     }
  ]
}

Ответы [ 2 ]

4 голосов
/ 23 сентября 2019

«Можно ли достичь без операции раскрутки $?»

Хорошо ДА.Пока ваша структура массивов массивов последовательно отображается таким образом, вам действительно нужна только одна стадия в конвейере:

db.collection.aggregate([
  { "$addFields": {
     "combs": {
       "$map": {
         "input": "$combs",
         "in": { "$mergeObjects": "$$this" }
       }
     }
  }}
])

Так что на самом деле $mapОператор используется здесь как гораздо более эффективный метод, чем $unwind для обработки каждого элемента массива.Кроме того, поскольку $mergeObjects ожидает «массив объектов» , это то, чем фактически является каждый элемент вашего массива массивов .Так просто { "$mergeObjects": "$$this" } на каждом внешнем элементе массива.

Производит вывод из ваших предоставленных данных:

{
        "_id" : ObjectId("5d8865c273375a6a4cc9e76a"),
        "combs" : [
                {
                        "name" : "A",
                        "c_type" : "A",
                        "type" : "visual",
                        "severity" : "Normal"
                },
                {
                        "name" : "B",
                        "c_type" : "B",
                        "type" : "visual",
                        "severity" : "Normal"
                }
        ]
}

Как правило, вы всегда должны предпочитать встроенный процессорнапример, $map или другие операторы массива вместо $unwind, где это применимо.

0 голосов
/ 23 сентября 2019

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

db.collection.aggregate([
     { $unwind: "$combs" },
     { $addFields: { combs: { $mergeObjects: "$combs" }}},
     { $group: { _id: "$_id", combs: { $push: "$combs" }} }
 ])
...