How to filter array in subdocument with MongoDB -


this question has answer here:

i have array in subdocument this

{     "_id" : objectid("512e28984815cbfcb21646a7"),     "list" : [         {             "a" : 1         },         {             "a" : 2         },         {             "a" : 3         },         {             "a" : 4         },         {             "a" : 5         }     ] } 

can filter subdocument > 3

my expect result below

{     "_id" : objectid("512e28984815cbfcb21646a7"),     "list" : [         {             "a" : 4         },         {             "a" : 5         }     ] } 

i try use $elemmatch returns first matching element in array

my query:

db.test.find( { _id" : objectid("512e28984815cbfcb21646a7") }, {      list: {          $elemmatch:              { a: { $gt:3 }              }      }  } ) 

the result return 1 element in array

{ "_id" : objectid("512e28984815cbfcb21646a7"), "list" : [ { "a" : 4 } ] } 

and try use aggregate $match not work

db.test.aggregate({$match:{_id:objectid("512e28984815cbfcb21646a7"), 'list.a':{$gte:5}  }}) 

it's return element in array

{     "_id" : objectid("512e28984815cbfcb21646a7"),     "list" : [         {             "a" : 1         },         {             "a" : 2         },         {             "a" : 3         },         {             "a" : 4         },         {             "a" : 5         }     ] } 

can filter element in array result expect result?

using aggregate right approach, need $unwind list array before applying $match can filter individual elements , use $group put together:

db.test.aggregate(     { $match: {_id: objectid("512e28984815cbfcb21646a7")}},     { $unwind: '$list'},     { $match: {'list.a': {$gt: 3}}},     { $group: {_id: '$_id', list: {$push: '$list.a'}}}) 

outputs:

{   "result": [     {       "_id": objectid("512e28984815cbfcb21646a7"),       "list": [         4,         5       ]     }   ],   "ok": 1 } 

mongodb 3.2 update

starting 3.2 release, can use new $filter aggregation operator more efficiently including list elements want during $project:

db.test.aggregate([     { $match: {_id: objectid("512e28984815cbfcb21646a7")}},     { $project: {         list: {$filter: {             input: '$list',             as: 'item',             cond: {$gt: ['$$item.a', 3]}         }}     }} ]) 

Comments

Popular posts from this blog

serialization - Convert Any type in scala to Array[Byte] and back -

matplotlib support failed in PyCharm on OSX -

python - Matplotlib: TypeError: 'AxesSubplot' object is not callable -