$elemMatch
の動作に問題はありません 。期待どおりに動作します。ドキュメントには次のようにも書かれています:
経験則として、array
を投影するときはいつでも $elemMatch
を使用する 、1つだけ の要素は最大で投影されます 。配列内のどの要素も一致しない場合、フィールドはまったく投影されません。
したがって、得られる結果は正しく、$elemMatch
の条件に一致する配列の最初のアイテムのみです。 projected
されます 。
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
statuss配列内のドキュメントの順序を変更してみてください。そのドキュメントが配列内の他の一致するドキュメントよりも前に表示される場合は、別の一致するドキュメントを取得する可能性があります。
参照: $ elemMatch
要件に応じて、一致するすべての配列要素を結果に含める場合は、集計操作を実行する必要があります。
Match
必要な_idを持つドキュメントと、検索しているステータスサブドキュメントを含むドキュメント。unwind
ステータス配列。- もう一度
match
巻き戻された個々のドキュメント。 - 最後に
group
_id
によって一致したドキュメント 。
コード:
db.collection.aggregate([
{$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$unwind:"$Statuses"},
{$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
])
これにより、配列内の一致するすべてのサブドキュメントが提供されます。