2015-11-07 4 views
-2

Скажем, у меня есть агрегацию, которая возвращает следующее:MongoDB Sum массив с объектами

[ 
    {driverId: 21312asd12, cars: 2, totalMiles: 30000, family: 4}, 
    {driverId: 55512a23a2, cars: 3, totalMiles: 55000, family: 2}, 
    ... 
    ] 

Как бы я идти о запуске суммирования каждого набора данных на основе GroupID вернуть следующее? Я использую $ unwind? Сделайте еще одну группу?

Например, я хотел бы вернуться:

{ 
    totalDrivers: 2, 
    totalCars: 5, 
    totalMiles: 85000, 
    totalFamily: 6 
} 

ответ

1

Вы, кажется, просто ссылаясь на документы в выходном сигнале, как «массив», поэтому просто добавьте еще $group к концу вашего трубопровода :

{ "$group": { 
    "_id": null, 
    "totalDrivers": { "$sum": 1 }, 
    "totalCars": { "$sum": "$cars" }, 
    "totalMiles": { "$sum": "$totalMiles" }, 
    "totalFamily": { "$sum": "$family" } 
}} 

Где null, по существу, просто пустой ключ группировки, которая не является поле присутствует в документе группы по. Результатом должен быть один документ (хотя и в массиве, в зависимости от используемого вызова метода API или версии сервера).

Или, если вы на самом деле означает, что каждый документ имеет поле с массивом, как это, то $unwind и обработать группу либо в документе или с null, как описано выше:

{ "$unwind": "$someArray" }, 
{ "$group": { 
    "_id": "$_id", 
    "totalDrivers": { "$sum": 1 }, 
    "totalCars": { "$sum": "$someArray.cars" }, 
    "totalMiles": { "$sum": "$someArray.totalMiles" }, 
    "totalFamily": { "$sum": "$someArray.family" } 
}} 

В любом случае, вы должны действительно отправляйте код, который вы используете, задавая такие вопросы. Весьма вероятно, что ваш трубопровод может оказаться не таким эффективным, чтобы вы могли достичь своей конечной цели, как вы думаете, и если бы вы опубликовали, что он дает четкое представление о том, что вы делаете, а также оставляет его открытым для предлагаемого улучшения.

+0

Я на самом деле понял это, используя первый метод, который вы упомянули, но вы избили меня, отправив ответ, чтобы я голосовал за ваш ответ! – xxyyzz

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