Il nuovo $elemMatch
di MongoDB 2.2 L'operatore di proiezione fornisce un altro modo per modificare il documento restituito in modo che contenga solo il primo shapes
corrispondenti elemento:
db.test.find(
{"shapes.color": "red"},
{_id: 0, shapes: {$elemMatch: {color: "red"}}});
Resi:
{"shapes" : [{"shape": "circle", "color": "red"}]}
In 2.2 puoi anche farlo usando l'$ projection operator
, dove il $
in un oggetto di proiezione il nome del campo rappresenta l'indice del primo elemento della matrice corrispondente del campo dalla query. Quanto segue restituisce gli stessi risultati di cui sopra:
db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});
Aggiornamento MongoDB 3.2
A partire dalla versione 3.2, puoi utilizzare il nuovo $filter
operatore di aggregazione per filtrare un array durante la proiezione, che ha il vantaggio di includere tutto corrispondenze, anziché solo la prima.
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
}}
])
Risultati:
[
{
"shapes" : [
{
"shape" : "circle",
"color" : "red"
}
]
}
]