2015-12-01 2 views
0

У меня есть документы с той же структурой, что я хочу объединить в один, используя $ sum. Вот пример моего документа.Совокупные вложенные массивы в соответствии с их идентификатором

{ 
    "_id" : 50, 
    "revenue" : 5000 
    "spendings" :[ 
    { 
    "id" : 1 
    "catalogue" [ 
     { 
     "id": 5 
     "viewcount": 150 
     "value": 10 
     }, 
     { 
     "id": 6 
     "viewcount": 500 
     "value": 20 
     } 
    ] 
    }, 
    { 
    "id": 2 
    "catalogue" [ 
     { 
     "id": 3 
     viewcount: 150 
     value: 10 
     } 
    ] 
    } 
} 

и

{ 
    "_id" : 51, 
    "revenue" : 6000 
    "spendings" :[ 
    { 
    "id" : 1 
    "catalogue" [ 
     { 
     "id": 5 
     "viewcount": 100 
     "value": 5 
     }, 
     { 
     "id": 6 
     "viewcount": 400 
     "value": 15 
     } 
    ] 
    }, 
    { 
    "id": 2 
    "catalogue" [ 
     { 
     "id": 3 
     viewcount: 600 
     value: 30 
     } 
    ] 
    } 
} 

Я хочу, чтобы создать один документ из тех двух, где я использую $ сумму сложить соответствующие идентификаторы. Результат должен выглядеть так.

{ 
    "_id" : 52, 
    "revenue" : 11000 
    "spendings" :[ 
    { 
    "id" : 1 
    "catalogue" [ 
     { 
     "id": 5 
     "viewcount": 250 
     "value": 15 
     }, 
     { 
     "id": 6 
     "viewcount": 900 
     "value": 35 
     } 
    ] 
    }, 
    { 
    "id": 2 
    "catalogue" [ 
     { 
     "id": 3 
     viewcount: 750 
     value: 40 
     } 
    ] 
    } 
} 

но только один массив используется. Есть ли возможность группировать массив внутри другого массива?

То, что я пытался до сих пор:

db.conversion.aggregate([ 
    { "$match": { "revenue" : { "$gte" : 5000 , "$lte" : 6000 } } }, 
    { "$unwind": "$spendings" }, 
    { "$unwind": "$spendings.catalogue" }, 
    { 
     "$group": { 
      "_id": { "spendid": "$spendings.id", "catalogueid": "$spendings.catalogue.id"}, 
      "rv": { "$sum": "$revenue" }, 
      "catvw": { "$sum": "$spendings.catalogue.viewcount" }, 
      "catval": { "$sum": "$spendings.catalogue.value" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "rev": { "$first": "$rv" }, 
      "spendings": { 
       "$push": { 
        "id": "$spendid", 
        "catid": "$" 
        "catview": "$catvw" , 
        "catvalue": "$catval" 
       } 
      }   
     } 
    } 
]) 

но не работает

+0

@MarkusWMahlberg Я добавил то, что я пробовал в описании. – adpap

ответ

1

Я хотел сделать что-то подобное в моем приложении, так вот мое решение. Я экспериментировал некоторое время, и этот подход работал для меня.

{ "$match": { "revenue" : { "$gte" : 5000 , "$lte" : 6000 } } }, 
{ "$unwind": "$spendings" }, 
{ 
    "$group": { 
     "_id": "$spendings.id", 
     "rev": { "$sum": "$revenue"}, 
     "spend": { "$push": "$spendings" } 
    } 
}, 
{ "$unwind": "$spend" }, 
{ "$unwind": "$spend.catalogue" }, 
{ 
    "$group": { 
     "_id": {"catid": "$spend.catalogue.id", "spendid": "$_id" } 
     "revenue": { "$first": "$rev"}, 
     "vcsum": {$sum: "$spend.catalogue.viewcount"}, 
     "valuesum": {$sum: "$spend.catalogue.value"}, 
    } 
}, 
{ 
    "$group": { 
     "_id": "$_id.spendid", 
     "revenues": { "$first": "$revenue"}, 
     "catalogues": { 
       "$push": { 
       "_id": "$_id.catid", 
       "viewcount": "$vcsum", 
       "value": "$valuesum", 
       } 
      } 
    } 
}, 
{ 
    "$group": { 
     "_id": null, 
     "revenues": { "$first": "$revenues"}, 
     "spendings": { 
       "$push": { 
        "catalogue": "$catalogues" 
       } 
      } 
    } 
} 

Возможно, это поможет.