MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Récupérer uniquement l'élément interrogé dans un tableau d'objets dans la collection MongoDB

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"
            }
        ]
    }
]