i'd multiple fields in collection list condition. tried aggregate request have error.
my request
db.people.aggregate({$match:{createddate:{$exists:true},"ad":"noc2"}},{$group:{value2:$value2}});
my json :
db.test.findone(); { "_id" : objectid("51e7dd16d2f8db27b56ea282"), "ad" : "noc2", "list" : { "p45" : { "id" : "p45", "date" : isodate("2014-01-01t12:18:30.568z"), "value3" : 21, "value1" : 100, "value2" : 489 }, "p6" : { "id" : "p6" "date" : isodate("2013-07-18t12:18:30.568z"), "value3" : 21, "value1" : 100, "value2" : 489 }, "p4578" : { "id" : "4578" "date" : isodate("2013-07-18t12:18:30.568z"), "value3" : 21, "value1" : 100, "value2" : 489 } } } i want json, example, in result :
{id:p45,value:587},{id:p4578,value:47},{id:p6,value:2}
there several issues sample document , aggregation:
- the sample doc not match aggregation query because matching on
createddatefield existing - the
$group()operator works on document level , needs_idfield group by - your
listfield embedded document, not array - aside formatting, there no obvious way relate sample values calculated result looking for
here adjusted example document list array unique values each item happen add value numbers mentioned:
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 } ] }) you can use $unwind operator extract matching subdocuments.
it unclear current question description $group operation trying achieve , whether need $group.
here example using aggregation framework $add (total) 3 values each list item:
db.people.aggregate( // find relevant docs (can use index if available) { $match: { createddate: { $exists:true }, "ad":"noc2" }}, // convert list array stream of documents { $unwind: "$list" }, // add (value1, value2, value3) each list item { $project: { _id: "$list.id", value: { $add: [ "$list.value1", "$list.value2", "$list.value3"] } }} ); sample output:
{ "result" : [ { "_id" : "p45", "value" : 587 }, { "_id" : "p6", "value" : 47 }, { "_id" : "4578", "value" : 2 } ], "ok" : 1 } note i've aggregated using single document example, , output 1 result document every item in list array.
in real usage may want add additional aggregation step $group document _id or other criteria, depending on outcome trying achieve.
Comments
Post a Comment