2015-08-26 2 views
0

Мне нужно получить $ sum и $ avg вложенных документов, я хотел бы получить $ sum и $ avg из каналов [0] .. и других каналов. моя структура данных выглядит следующим образом

{ 
    _id : ... Location : 1, 
    Channels : [ 
    { _id: ..., 
      Value: 25 
    }, 
    {  
      _id: ... , 
      Value: 39 
    }, 
    {  
      _id: .., 
      Value: 12 
    } 
    ] 
} 
+0

Формулировка вашего вопроса немного запутанна. Вы пытаетесь получить сумму и среднее значение всех элементов «Value» в элементе «Channels» для каждого документа * в вашем запросе? – whyceewhite

ответ

0

Решение 1: Использование двух групп на основе этого примера: previous question

db.records.aggregate(
    [ 
    { $unwind: "$Channels" }, 
    { $group: { 
      _id: { 
       "loc" : "$Location", 
       "cId" : "$Channels.Id" 
      }, 
      "value" : {$sum : "$Channels.Value" }, 
      "average" : {$avg : "$Channels.Value"}, 
      "maximun" : {$max : "$Channels.Value"}, 
      "minimum" : {$min : "$Channels.Value"} 
    }}, 
    { $group: { 
      _id : "$_id.loc", 
      "ChannelsSumary" : { $push : 
       { "channelId" : '$_id.cId', 
        "value" :'$value', 
        "average" : '$average', 
        "maximun" : '$maximun', 
        "minimum" : '$minimum' 
        }} 
     } 
    } 
    ] 
) 

Решение 2: есть свойство я не показал на мой первоначальный вопрос, который мог бы помочь «Channels.Id» независимо от «Channels._Id»

db.records.aggregate([ 
    { 
     "$unwind" : "$Channels" 
    }, 
    { 
     "$group" : { 
      "_id" : "$Channels.Id", 
      "documentSum" : { "$sum" : "$Channels.Value" }, 
      "documentAvg" : { "$avg" : "$Channels.Value" } 
     } 
    } 
]) 
2

Для того, чтобы получить сумму и средний из Channels.Value элементов для каждого документа в вашей коллекции, вам нужно будет использовать Aggregation обработки MongoDB в. Кроме того, поскольку Channels - это массив, вам нужно будет использовать оператор $unwind для деконструирования массива.

Предполагая, что ваша коллекция называется example, вот как вы могли бы получить как сумму документа и среднее значение Channels.Value с:

db.example.aggregate([ 
    { 
     "$unwind" : "$Channels" 
    }, 
    { 
     "$group" : { 
      "_id" : "$_id", 
      "documentSum" : { "$sum" : "$Channels.Value" }, 
      "documentAvg" : { "$avg" : "$Channels.Value" } 
     } 
    } 
]) 

Вывод данных вашего поста был бы:

{ 
    "_id" : SomeObjectIdValue, 
    "documentSum" : 76, 
    "documentAvg" : 25.333333333333332 
} 

Если в вашей коллекции имеется более одного документа, вы увидите строку результатов для каждого документа, содержащего массив Channels.

+0

Я запустил вышеуказанный код с моим db, имеющим 10 записей каждой записи, имеющей 4 канала, и сгенерировал объект с массивом из 109 элементов, а размер массива - длина массива каналов, но он помог мне получить решение – kahizer

+0

You получили 109 записей? Хм, это странно. Во всяком случае, похоже, что вы не * хотите группировать свою сумму и среднее по документу (то есть, _id). Вместо этого вы хотите группировать по индексу канала. Это было непонятно в вашем посте, но, я понимаю сейчас. – whyceewhite

+0

это именно то, что я сделал, извините, я не очень специфичен по моему вопросу – kahizer

Смежные вопросы