次のようなものを取得するためにMongoDBにクエリを実行しようとしています:
「[30,40] の範囲にない年齢の人を取得する」
私がやっている:
db.persons.find({'age' : {$nin : [{$lt : 30},{$gt : 40}]}})
これは私にとってはうまくいきません。年齢が 30 歳未満で年齢が 40 歳を超える人々のようなことができることは知っていますが、「not in」演算子を使用できるかどうか疑問に思っていました...ありがとう
次のようなものを取得するためにMongoDBにクエリを実行しようとしています:
「[30,40] の範囲にない年齢の人を取得する」
私がやっている:
db.persons.find({'age' : {$nin : [{$lt : 30},{$gt : 40}]}})
これは私にとってはうまくいきません。年齢が 30 歳未満で年齢が 40 歳を超える人々のようなことができることは知っていますが、「not in」演算子を使用できるかどうか疑問に思っていました...ありがとう
次のようにOR 接続詞を使用するとどうなりますか。
db.persons.find($or: [{'age': {$lt: 30}},{'age': {$gt : 40}}])
$in / $nin は、リスト内の離散値のクエリに使用される演算子であり、範囲検索には使用できません。
あなたの例では、 $nin を使用したクエリは次のようにする必要があります
db.persons.find({age:{$nin:[30,31,32,33,34,35,36,37,38,39,40]}})
これはまったく実用的ではなく、さらにインデックスを使用しません。
db.persons.ensureIndex({age:1})
db.persons.find({age:{$nin:[30,31,32,33,34,35,36,37,38,39,40]}}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
},
"server" : "Aspire-5750:27017"
}
上記のSgoettschkesの答えは正しく、インデックスを使用します:
db.persons.find({$or: [{'age': {$lt: 30}},{'age': {$gt : 40}}]}).explain()
{
"clauses" : [
{
"cursor" : "BtreeCursor age_1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 0,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 0,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 12,
"indexBounds" : {
"age" : [
[
-1.7976931348623157e+308,
30
]
]
}
},
{
"cursor" : "BtreeCursor age_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"age" : [
[
40,
1.7976931348623157e+308
]
]
}
}
],
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"millis" : 12,
"server" : "Aspire-5750:27017"
}
効果的なクエリの詳細については、http://docs.mongodb.org/manual/core/read-operations/ を参照してください。