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