sql >> Base de Datos >  >> NoSQL >> MongoDB

Recupere solo el elemento consultado en una matriz de objetos en la colección MongoDB

Nuevo $elemMatch de MongoDB 2.2 El operador de proyección proporciona otra forma de modificar el documento devuelto para que contenga solo el primero shapes coincidentes elemento:

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

Devoluciones:

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

En 2.2 también puedes hacer esto usando el operador de proyección $ projection operator , donde el $ projection operator en un campo de objeto de proyección, el nombre representa el índice del primer elemento de matriz coincidente del campo de la consulta. Lo siguiente devuelve los mismos resultados que arriba:

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

Actualización de MongoDB 3.2

A partir de la versión 3.2, puede usar el nuevo $filter operador de agregación para filtrar una matriz durante la proyección, que tiene la ventaja de incluir todos coincidencias, en lugar de solo la primera.

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

Resultados:

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