ドキュメントの内容を理解するには、まず、配列を使用した範囲クエリがどのように機能するかを理解する必要があります。
コレクションに次のドキュメントがあるとします。
{ "finished" : [ 27, 3 ] },
{ "finished" : 17 }
最初のクエリ:
db.users.find( { "finished": { "$elemMatch": { "$gt": 15, "$lt": 20 } } } )
「finished」が配列であるドキュメントのみを返します。これは、$elemMatch
が原因です。 演算子は、フィールドが配列であり、単一の要素がすべてのクエリ条件を満たすドキュメントにのみ一致します。
しかし、2番目のクエリ:
db.users.find( { "finished": { "$gt": 15, "$lt": 20 } } )
おそらくあなたが望むものではない両方のドキュメントを27
として返します 20
より大きい および3
15
未満です 。これは、27
最初の基準に一致し、3
二番目。この動作は、ドキュメントに記載されているものです。
... 1つの要素が15を超える条件を満たすことができ、別の要素が20未満の条件を満たすことができるか、または1つの要素が両方を満たすことができます:
結論:
配列に対する範囲クエリは、すべてのクエリ条件に一致する配列内の1つまたは複数の要素に一致します。
レッスン:
配列で範囲クエリを使用しないでください。予期しない結果が発生します。