MongoDB Aggregate преобразует общие объекты в массивы

#mongodb #aggregation-framework

#mongodb #платформа агрегации

Вопрос:

Я застрял в проблеме:

Мне нужно преобразовать:

[ {a:1 , b:2 , c:3} , {a:5, b:6, c:7} ]

В:

[{a:[1,5], b:[2,6] , c: [3,7]}]

Просто найдите общие ключи и сгруппируйте их.

Я не уверен, следует ли мне использовать $project $reduce или $ group. У кого-нибудь есть совет?

Комментарии:

1. Я придумал это mongoplayground.net/p/sm4MTXR-S-n

2. вы знаете, что у вас есть примерно 3 поля с такими именами? или у вас может быть 1, или 2, или 20, например, и вам нужно более общее решение?

Ответ №1:

Чтобы сделать это, мы должны сначала изменить объект на массив, чтобы можно было группировать по ключу. Вы можете проверить это здесь.

 {
  "$project": {
    "_id": 0 // First we have to eliminate the _id and all the other fields that we dont want to group
  }
},
{
  "$project": {
    "arr": {
      "$objectToArray": "$ROOT"
    }
  }
},
 

Затем мы должны размотать этот массив и сгруппировать ключи.

 {
  "$unwind": "$arr"
},
{
  "$group": {
    "_id": "$arr.k",
    "field": {
      "$push": "$arr.v"
    }
  }
}
 

Наконец, мы переназначаем информацию с желаемым результатом.

 {
  $replaceRoot: {
    newRoot: {
      $arrayToObject: [
        [
          {
            k: "$_id",
            v: "$field"
          }
        ]
      ]
    }
  }
}
 

Комментарии:

1. вы можете добавить еще 2 этапа, чтобы получить ожидаемый результат

2. Правда, мой результат не был точно таким же 🙂