MongoDB2.2の新しい$elemMatch
射影演算子は、返されたドキュメントを変更して最初ののみを含むようにする別の方法を提供します 一致した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});
MongoDB3.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"
}
]
}
]