MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Recupere apenas o elemento consultado em uma matriz de objetos na coleção do MongoDB


Novo $elemMatch do MongoDB 2.2 operador de projeção fornece outra maneira de alterar o documento retornado para conter apenas o primeiro shapes correspondentes elemento:
db.test.find(
    {"shapes.color": "red"}, 
    {_id: 0, shapes: {$elemMatch: {color: "red"}}});

Devoluções:
{"shapes" : [{"shape": "circle", "color": "red"}]}

Em 2.2 você também pode fazer isso usando o $ projection operator , onde o $ em um nome de campo de objeto de projeção representa o índice do primeiro elemento de matriz correspondente do campo da consulta. O seguinte retorna os mesmos resultados acima:
db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});

Atualização do MongoDB 3.2

A partir da versão 3.2, você pode usar o novo $filter operador de agregação para filtrar uma matriz durante a projeção, que tem a vantagem de incluir todos correspondências, em vez de apenas o primeiro.
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"
            }
        ]
    }
]