2016-12-08 2 views
0

У меня есть sql-фон и понимаю синтаксис для агрегирования данных в mongodb, но у меня возникают проблемы с «сглаживанием» вывода агрегации множественных ключей в MongoDB. Например, стандартный синтаксис выглядит следующим образом:mongodb множественная активация ключей

db.transactions.aggregate(
    [ 
    { $group: { _id: {"category":"$category","postdate":"$postdate"} , "total": { $sum: "$total" } } } 
    ] 
); 

Но это возвращает данные в следующем виде:

[{"_id":{"category":"Fees","postdate":"2013-01-04T05:00:00.000Z"},"total":24}, 
{"_id":{"category":"Fees","postdate":"2012-12-20T05:00:00.000Z"},"total":-0.02}] 

То, что я хочу, это данные в формате, как в следующем, где я до сих пор группировка на двух или более столбцов:

Вариант 1:

[{"_id":"Auto","postdate":"2013-01-04T05:00:00.000Z","total":24}, 
{"_id":"Fees","postdate":"2012-12-20T05:00:00.000Z","total":-0.02}] 

Вариант 2:

["category":"Auto","postdate":"2013-01-04T05:00:00.000Z","total":24}, 
{"category":"Fees","postdate":"2012-12-20T05:00:00.000Z","total":-0.02}] 

Как это сделать в mongodb?

+0

Опция 1 первая строка должна быть 'Тарифы'. Это опечатка? – Veeram

+0

Нет второго, фактически, должен быть «Авто». Изменено. Благодарю. –

+0

Я этого не понимаю. Ожидаете ли вы, что категория изменится? Можете ли вы включить образцы документов? Вы группируете по категориям, за которой следует дата публикации в агрегировании. Вам понадобится еще один групповой этап, чтобы сгруппировать их по категориям. – Veeram

ответ

2

Формат ваш ответ с помощью $project

Вариант 1:

db.transactions.aggregate(
     [ 
     { $group: { _id: {"category":"$category","postdate":"$postdate"} , "total": { $sum: "$total" } } }, 
     { $project: { "_id":0, "_id":"$_id.category", "postdate":"$_id.postdate", "total":1 } } 
     ] 
); 

Вариант 2:

db.transactions.aggregate(
     [ 
     { $group: { _id: {"category":"$category","postdate":"$postdate"} , "total": { $sum: "$total" } } }, 
     { $project: { "_id":0, "category":"$_id.category", "postdate":"$_id.postdate", "total":1 } } 
     ] 
);