hashmap - aggregate request MongoDB -


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 createddate field existing
  • the $group() operator works on document level , needs _id field group by
  • your list field 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