Монго добавляет новую пару ключ-значение на этапе $ group

#mongodb #mongodb-query #aggregation-framework

#mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

У меня есть коллекция документов, таких как:

 {
 "tagName": "Tag1",
 "value": 1,
 "ts": "2020/01/01 20:00"
},

{
 "tagName": "Tag2",
 "value": 2,
 "ts": "2020/01/01 20:00"
},

{
 "tagName": "Tag3",
 "value": 3,
 "ts": "2020/02/01 20:00"
}

 

Я бы хотел сгруппировать документы по ts и сформулировать tagName и value .
таким образом, вывод намерения будет:

 [

 {
  "Tag1": 1
  "Tag2": 2,
  "ts": "2020/01/01 20:00"
 },
 
 {
  "Tag3": 3,
  "ts": "2020/02/01 20:00"
 }

]
 

Я попробовал следующий конвейер:

   {
    $group: {
      '_id': '$ts',
      'output': {
        $push: {
          '$t': '$v'
        }
      }
    }
  }
 

Спасибо за вашу помощь!

Ответ №1:

Когда $group by ts , вы должны добавить tagName and value в массив -> преобразовать его обратно в tagName: value by $arrayToObject , а затем объединить его обратно в root, чтобы получить ожидаемый результат.

Игровая площадка

 db.collection.aggregate([
  {
    $group: {
      _id: "$ts",
      "tags": {
        "$push": {
          "k": "$tagName",
          "v": "$value"
        }
      }
    }
  },
  {
    $project: {
      "ts": "$_id",
      "tagsObj": {
        "$arrayToObject": "$tags"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {
            _id: "$_id",
            
          },
          "$tagsObj"
        ]
      }
    }
  }
])