投影法の違いはやや微妙です。使用例では、これらは(インデックスの使用に関して)同等のクエリである必要がありますが、$elemMatch
例では、クエリ条件を不必要に繰り返しています。 $
この例では、射影がより賢明な選択です。
ドキュメントに記載されている重要な違いは、配列です。フィールド制限
$
の場合 予測:
以下の射影演算子の違いに関するいくつかの追加の注意事項...
位置($
)射影演算子
:
-
クエリ結果に含まれる配列フィールドの内容を、クエリドキュメントに一致する最初の要素を含むように制限します。
-
一致する配列フィールドがクエリ条件に含まれている必要があります
-
クエリ条件に単一の配列フィールドが表示される場合にのみ使用できます
-
プロジェクションでは1回しか使用できません
$elemMatch
射影演算子
-
クエリ結果に含まれる配列フィールドの内容を、$elemMatch条件に一致する最初の配列要素のみを含むように制限します 。
-
一致する配列がクエリ条件に含まれている必要はありません
-
埋め込まれたドキュメントである配列要素の複数の条件に一致させるために使用できます
$elemMatch
クエリ演算子
$elemMatch
もあることに注意してください 同様のマッチングを実行するクエリ演算子ですが、結果の射影ではなくクエリで実行されます。これが$
と組み合わせて使用されるのを見るのは珍しいことではありません 投影。
ドキュメントからの例 を借用 両方を使用できる場所:
db.students.find(
// use $elemMatch query operator to match multiple criteria in the grades array
{ grades: {
$elemMatch: {
mean: { $gt: 70 },
grade: { $gt: 90 }
}
}},
// use $ projection to get the first matching item in the "grades" array
{ "grades.$": 1 }
)