Есть несколько проблем с образцом документа и агрегацией:
- образец документа не будет соответствовать вашему запросу агрегации, потому что вы сопоставляете
createdDate
существующее поле
$group()
оператор работает на уровне документа и требует поля _id
для группировки по
- ваше поле
list
является встроенным документом, а не массивом
- помимо форматирования, нет очевидного способа связать значения выборки с вычисленным результатом, который вы ищете.
Вот скорректированный пример документа с list
в виде массива, а также некоторыми уникальными значениями для каждого элемента, которые складываются в упомянутые вами числа value
:
db.people.insert({
"ad" : "noc2",
"createdDate" : ISODate(),
"list" : [
{
"id" : "p45",
"date" : ISODate("2014-01-01T12:18:30.568Z"),
"value3" : 21,
"value1" : 77,
"value2" : 489
},
{
"id" : "p6",
"date" : ISODate("2013-07-18T12:18:30.568Z"),
"value3" : 20,
"value1" : 20,
"value2" : 7
},
{
"id" : "4578",
"date" : ISODate("2013-07-18T12:18:30.568Z"),
"value3" : 21,
"value1" : 300,
"value2" : -319
}
]
})
Теперь вы можете использовать оператор $unwind
для извлечения соответствующих вложенных документов.
Из текущего описания вопроса неясно, какую операцию $group
вы пытаетесь выполнить и действительно ли вам нужна $group
.
Вот пример использования Aggregation Framework для $add
(всего) трех значений для каждого элемента списка:
db.people.aggregate(
// Find relevant docs (can use index if available)
{ $match: {
createdDate: { $exists:true },
"ad":"noc2"
}},
// Convert list array to stream of documents
{ $unwind: "$list" },
// Add (value1, value2, value3) for each list item
{ $project: {
_id: "$list.id",
value: { $add: [ "$list.value1", "$list.value2", "$list.value3"] }
}}
);
Пример вывода:
{
"result" : [
{
"_id" : "p45",
"value" : 587
},
{
"_id" : "p6",
"value" : 47
},
{
"_id" : "4578",
"value" : 2
}
],
"ok" : 1
}
Обратите внимание, что я агрегировал только один документ для этого примера, и на выходе будет один результирующий документ для каждого элемента в массиве list
.
В реальном использовании вы можете добавить дополнительный шаг агрегирования в $group
по документу _id
или некоторым другим критериям, в зависимости от результата, которого вы пытаетесь достичь.
person
Stennie
schedule
20.07.2013
result
на читаемый Json. - person chaliasos   schedule 19.07.2013db.people.aggregate({$match:{createdDate:{$exists:true},"ad":"noc2"}},{$group:{value2:"$value2"}});
- person Satheesh Kumar   schedule 19.07.2013