2017  Kodetalk | Feedback | Privacy Policy | Terms | About

Retrieve only the queried element in an object array in MongoDB collection

// Document 1{ "shapes":   [    {"shape": "square", "color": "blue"},    {"shape": "circle", "color": "red"}  ] }

// Document 2{ "shapes":   [    {"shape": "square", "color": "black"},    {"shape": "circle", "color": "green"}  ] }

Iam quering it the following way :

db.test.find({"shapes.color": "red"}, {"shapes.color": 1}) or
db.test.find({shapes: {"$elemMatch": {color: "red"}}}, {"shapes.color": 1})

returns matched document (Document 1), but always with ALL array items in shapes:
{ "shapes":   [    {"shape": "square", "color": "blue"},    {"shape": "circle", "color": "red"}  ] }

However, I"d like to get document (Document 1) only with the array that contains color=red:
{ "shapes":   [    {"shape": "circle", "color": "red"}  ] }

How can I do this?

Thanks in advance


MongoDB 2.2's new $elemMatch projection operator provides another way to alter the returned document to contain only the first matched shapes element:


{"shapes.color": "red"},    

{_id: 0, shapes: {$elemMatch: {color: "red"}}});

The above query return the following answer :

{"shapes" : [{"shape": "circle", "color": "red"}]}

In 2.2 you can also do this using the $ projection operator, where the $ in a projection object field name represents the index of the field's first matching array element from the query.

The following returns the same results as above:

db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});

Answer is