sql >> Databasteknik >  >> NoSQL >> MongoDB

Hämta endast det frågade elementet i en objektmatris i MongoDB-samlingen

MongoDB 2.2:s nya $elemMatch projektionsoperatorn tillhandahåller ett annat sätt att ändra det returnerade dokumentet så att det bara innehåller det första matchade shapes element:

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

Returnerar:

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

I 2.2 kan du också göra detta med $ projection operator , där $ i en projektionsobjekt representerar fältnamnet indexet för fältets första matchande matriselement från frågan. Följande ger samma resultat som ovan:

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

MongoDB 3.2-uppdatering

Från och med version 3.2 kan du använda det nya $filter aggregeringsoperator för att filtrera en array under projektion, vilket har fördelen av att inkludera alla matchar, istället för bara den första.

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

Resultat:

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


  1. Hur man cachelagrar stora objekt med Redis cache

  2. Befolka kapslad array i mangust

  3. Docker:ändra mapp där dockningsvolymer ska lagras

  4. Hur man slår samman arrayfält i dokument i Mongo-aggregation