Le nouveau $elemMatch
de MongoDB 2.2 L'opérateur de projection fournit un autre moyen de modifier le document renvoyé pour qu'il ne contienne que le premier shapes
assorties élément :
db.test.find(
{"shapes.color": "red"},
{_id: 0, shapes: {$elemMatch: {color: "red"}}});
Renvoie :
{"shapes" : [{"shape": "circle", "color": "red"}]}
En 2.2, vous pouvez également le faire en utilisant l'$ projection operator
, où le $
dans un champ d'objet de projection, le nom représente l'index du premier élément de tableau correspondant du champ à partir de la requête. Ce qui suit renvoie les mêmes résultats que ci-dessus :
db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});
Mise à jour MongoDB 3.2
À partir de la version 3.2, vous pouvez utiliser le nouveau $filter
opérateur d'agrégation pour filtrer un tableau lors de la projection, qui a l'avantage d'inclure tous correspondances, au lieu de simplement la première.
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
}}
])
Résultats :
[
{
"shapes" : [
{
"shape" : "circle",
"color" : "red"
}
]
}
]