3

$min/$max$lte/の違いがよくわかりません$gt。これらのメソッドのクエリ修飾子とクエリ演算子の違いがよくわかりません。$min/$maxが複合インデックス境界に必要であることは理解していますが、単一のインデックス フィールドに境界を指定する場合に違いはありますか?

4

1 に答える 1

5

簡単な説明: min max は、そのフィールドにインデックスがないと機能しません。

より長い説明: $min$maxはクエリ修飾子であり、$lte$gtはクエリ演算子です。クエリ修飾子 (名前が示すように) は、クエリの動作を変更します。しかし

サーバーでは、MongoDB はクエリとオプションを 1 つのオブジェクトとして扱います。

これは、実行している場合、db.coll.find({}).min({a : 1});すべてを見つけるのではなく、1 より大きいか等しいすべてのものを選択することを意味します。誰もが最もよく知っているのはsort修飾子です。この方法でもすべての修飾子を使用できますdb.collection.find()._addSpecial("modifierName", "options" )

どちらのコマンドも同様のことを行っています。違いは微妙です: $min と $max は、そのフィールドにインデックスがある場合にのみ検索できます。そうしないと、エラーで失敗します。さらに、検索中にそのインデックスを使用していて、何か他のものを使用したい場合は、ヒントコマンドでこれを伝える必要があります。

次の形式のドキュメントを含むコレクション zip があるとします。

{
  "city" : "ACMAR",
  "loc" : [-86.51557, 33.584132],
  "pop" : 6055,
  "state" : "AL",
  "_id" : 35004
}

あなたがするならdb.zips.find().min( { pop: 5000 } )。エラーでクラッシュするだけです。$gte で同じことをしている間、問題なく実行されます。このフィールドのインデックスを確保する場合、このコマンドを実行すると、このインデックスが使用されます。

ヒントコマンドについてのコメントについて。このようなものが必要db.zips.find({_id : 333}).min( { pop: 5000 } )で、pop にインデックスがあるとします。それを使用しますが、_id インデックスを使用する方がはるかに優れています。

したがって、全体として、何が優れているかを判断するのはあなた次第です。

  • フィールドにインデックスがあり、常にそれを使用したい場合は、.max / .min を使用できます
  • 持っていない場合は、$gte / $lt を使用する必要があります。
  • インデックスを持っているが、mongo の方がどのインデックスを使用すべきかをよく知っていると思われる場合は、$gte /$lt も使用してください

PS。このコマンドはあいまいなので好きではありません。1 分では境界は包括的ですが、最大では排他的であり、覚え方がわかりません。

于 2013-10-31T22:34:50.847 に答える