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