MongoDB 2.2's nieuwe $elemMatch
projectie-operator biedt een andere manier om het geretourneerde document te wijzigen zodat het alleen de eerste . bevat overeenkomende shapes
element:
db.test.find(
{"shapes.color": "red"},
{_id: 0, shapes: {$elemMatch: {color: "red"}}});
Retourneren:
{"shapes" : [{"shape": "circle", "color": "red"}]}
In 2.2 kunt u dit ook doen met de $ projection operator
, waarbij de $
in een projectieobject vertegenwoordigt veldnaam de index van het eerste overeenkomende array-element van het veld uit de query. Het volgende geeft dezelfde resultaten als hierboven:
db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});
MongoDB 3.2-update
Vanaf release 3.2 kun je de nieuwe $filter
. gebruiken aggregatie-operator om een array te filteren tijdens projectie, wat het voordeel heeft dat alle . wordt opgenomen overeenkomsten, in plaats van alleen de eerste.
db.test.aggregate([
// Get just the docs that contain a shapes element where color is 'red'
{$match: {'shapes.color': 'red'}},
{$project: {
shapes: {$filter: {
input: '$shapes',
as: 'shape',
cond: {$eq: ['$$shape.color', 'red']}
}},
_id: 0
}}
])
Resultaten:
[
{
"shapes" : [
{
"shape" : "circle",
"color" : "red"
}
]
}
]