Новият $elemMatch
на MongoDB 2.2 проекционният оператор предоставя друг начин за промяна на върнатия документ, за да съдържа само първия съвпадащи shapes
елемент:
db.test.find(
{"shapes.color": "red"},
{_id: 0, shapes: {$elemMatch: {color: "red"}}});
Връща:
{"shapes" : [{"shape": "circle", "color": "red"}]}
В 2.2 можете също да направите това с помощта на $ projection operator
, където $
в проекционен обект името на полето представлява индекса на първия съвпадащ елемент от масива на полето от заявката. Следното връща същите резултати като по-горе:
db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});
Актуализация на MongoDB 3.2
Започвайки с версия 3.2, можете да използвате новия $filter
оператор за агрегиране за филтриране на масив по време на проекцията, което има предимството да включва всички съвпадения, вместо само първото.
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
}}
])
Резултати:
[
{
"shapes" : [
{
"shape" : "circle",
"color" : "red"
}
]
}
]