MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Recupera solo l'elemento richiesto in un array di oggetti nella raccolta MongoDB

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