2016-05-19 1 views
1

Предоставлено следующий пример набора данных:Возвращает сумму элементов массива и других полей

[ 
    { 
    _id: 1, 
    prices: [1,2,3], 
    category: 'stuff' 
    }, 
    { 
    _id: 2, 
    prices: [4,5,6], 
    category: 'stuff' 
    }, 
    { 
    _id: 3, 
    prices: [7,8,9], 
    category: 'misc' 
    } 
]; 

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

[ 
    { 
    _id: 1, 
    prices: 6, 
    category: 'stuff' 
    }, 
    { 
    _id: 2, 
    prices: 15, 
    category: 'stuff' 
    }, 
    { 
    _id: 3, 
    prices: 24, 
    category: 'misc' 
    } 
] 

я могу получить это:

[ 
    { 
    _id: 1, 
    prices: 6 
    }, 
    { 
    _id: 2, 
    prices: 15 
    }, 
    { 
    _id: 3, 
    prices: 24 
    } 
] 

Используя что-то вроде этого:

[ 
    { $unwind: '$prices' }, 
    { $group: { _id: '$_id', prices: { $sum: '$prices' } } }, 
    { $project: { prices: 1 } } 
] 

Но я не могу понять, как включить его в категорию «категория».

ответ

1

Оптимальный способ для этого - MongoDB 3.2 или новее с использованием оператора аккумулятора $sum на этапе $project.

db.collection.aggregate([ 
    { "$project": { 
     "price": { "$sum": "$prices" }, 
     "category": "$category" 
    }} 
]) 

, который производит:

{ "_id" : 1, "category" : "stuff", "price" : 6 } 
{ "_id" : 2, "category" : "stuff", "price" : 15 } 
{ "_id" : 3, "category" : "misc", "price" : 24 } 

В MongoDB версии < = 3.0 вам нужно использовать оператор $first.

db.collection.aggregate([ 
    { $unwind: '$prices' }, 
    { $group: { 
     _id: '$_id', 
     prices: { $sum: '$prices' }, 
     category: { '$first': '$category' } 
    }} 
])