Группировать и агрегировать по вложенному документу в mongodb

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

OBS! Вероятно, вопрос новичка 🙂

Учитывая следующие данные, как я могу запросить и вернуть сводку для каждого индекса?

 [
{
    "title": "test",
    "indexes":[
        { "id":1, "value": 0.5764860139860139860139860140 },
        { "id":2, "value": 0.3083479020979020979020979020 },
        { "id":3, "value": 0.1151660839160839160839160838 }
    ]
},
{
    "title": "test",
    "indexes":[
        { "id":1, "value": 0.5764860139860139860139860140 },
        { "id":2, "value": 0.3083479020979020979020979020 },
        { "id":3, "value": 0.1151660839160839160839160838 }
    ]
},
{
    "title": "test",
    "indexes":[
        { "id":1, "value": 0.5764860139860139860139860140 },
        { "id":2, "value": 0.3083479020979020979020979020 },
        { "id":3, "value": 0.1151660839160839160839160838 }
    ]
},
{
    "title": "test",
    "indexes":[
        { "id":1, "value": 0.5764860139860139860139860140 },
        { "id":2, "value": 0.3083479020979020979020979020 },
        { "id":3, "value": 0.1151660839160839160839160838 }
    ]
}
 

]

Т.е. я хочу создать что-то вроде этого:

 index.id:1, total: 2.305...
index.id:2, total: 1.233...
etc
 

Ответ №1:

 db.collection.aggregate([
  {
    "$unwind": "$indexes"
  },
  {
    $group: {
      _id: "$indexes.id",
      total: {
        $sum: "$indexes.value"
      }
    }
  }
])
 

попробуйте выполнить этот запрос

вы получите вот так

 [
  {
    "_id": 2,
    "total": 1.2333916083916083
  },
  {
    "_id": 1,
    "total": 2.305944055944056
  },
  {
    "_id": 3,
    "total": 0.4606643356643357
  }
]
 

Ответ №2:

 db.collection.aggregate([
  {
    $unwind: "$indexes"
  },
  {
    $group: {
      _id: "$indexes.id",
      total: {
        $sum: "$indexes.value"
      }
    }
  }
])
 

Рабочая игровая площадка Mongo