2016-01-24 4 views
1

Моей Структура документа:Как агрегировать значение внутреннего массива в MongoDB?

{"id" : 1 
    "apps" : [ 
     { 
      "name" : "APP1", 
      "date_added" : Timestamp(1453470861, 1), 
      "power" : [ 
       { 
        "date" : Timestamp(1453470960, 1), 
        "amount" : 30.3739953125 
       }, 
       { 
        "date" : Timestamp(1453470960, 1), 
        "amount" : 30.3739953125 
       }, 
       { 
        "date" : Timestamp(1453470960, 1), 
        "amount" : 30.3739953125 
       }, 
       { 
        "date" : Timestamp(1453470967, 1), 
        "amount" : 30.30951765625 
       } 
     }] 
} 

У меня есть кратные приложения в документе, но только один отвечала.

Я хочу сгруппировать по apps.name и получить сумму power.amount для каждого приложения. Это код, который я придумал:

db.x.aggregate([{$match:{id:1}},{$unwind:"$apps"},{$group:{_id:"$apps.name",total:{$sum:"$apps.power.amount"}}}]) 

Но я получаю это как результат:

{ "_id" : "APP1", "total" : 0 } 

Может кто-нибудь сказать мне, что вызывает запрос, чтобы дать ноль в качестве ответа?

ответ

1

Попробуйте $ отключить "власть", прежде чем считать его.

это мое предложение:

db.x.aggregate([{$match:{id:1}},{$unwind:"$apps"},{$unwind:"$apps.power"},{$group:{_id:"$apps.name",total:{$sum:"$apps.power.amount"}}}]) 
+1

Он работал. Большое спасибо –

0

MongoDB версии 3.2 или новее решение:

После $match этапе Следующим этапом является $project этап, на котором вы в основном использовать $map для возврата 2d массив " количество". Оттуда вам нужно денормализовать массив 2d, используя оператор $unwind. Последним этапом в трубопроводе является еще один этап $project, в котором вы используете операционный накопитель $sum, доступный на этапах $group и $project, начиная с версии 3.2 для расчета общей суммы «сумма».

db.collection.aggregate(
    [ 
     { "$match": { "id": 1 } }, 
     { "$project": { 
      "amounts": { 
       "$map": { 
        "input": "$apps", 
        "as": "app", 
        "in": { 
         "$map": { 
          "input": "$$app.power", 
          "as": "p", 
          "in": "$$p.amount" 
         } 
        } 
       } 
      } 
     }}, 
     { "$unwind": "$amounts" }, 
     { "$project": { "total": { "$sum": "$amounts" } } } 
    ] 
) 

Что дает:

{ "_id" : ObjectId("56a54de01964fd33b12ccaab"), "total" : 121.43150359375 } 
Смежные вопросы