MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Rufen Sie nur das abgefragte Element in einem Objektarray in der MongoDB-Sammlung ab

Das neue $elemMatch von MongoDB 2.2 Der Projektionsoperator bietet eine weitere Möglichkeit, das zurückgegebene Dokument so zu ändern, dass es nur das erste enthält übereinstimmende shapes Element:

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

Rückgabe:

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

In 2.2 können Sie dies auch mit dem $ projection operator tun , wobei $ in einem Projektionsobjekt repräsentiert der Feldname den Index des ersten übereinstimmenden Array-Elements des Felds aus der Abfrage. Folgendes gibt die gleichen Ergebnisse wie oben zurück:

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

MongoDB 3.2-Update

Ab Version 3.2 können Sie den neuen $filter verwenden Aggregationsoperator, um ein Array während der Projektion zu filtern, was den Vorteil hat, all einzuschließen Übereinstimmungen statt nur der ersten.

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

Ergebnisse:

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