0

次のようなものを取得するためにMongoDBにクエリを実行しようとしています:

「[30,40] の範囲にない年齢の人を取得する」

私がやっている:

db.persons.find({'age' : {$nin : [{$lt : 30},{$gt : 40}]}})

これは私にとってはうまくいきません。年齢が 30 歳未満で年齢が 40 歳を超える人々のようなことができることは知っていますが、「not in」演算子を使用できるかどうか疑問に思っていました...ありがとう

4

2 に答える 2

2

次のようにOR 接続詞を使用するとどうなりますか。

db.persons.find($or: [{'age': {$lt: 30}},{'age': {$gt : 40}}])
于 2013-03-15T15:53:09.673 に答える
1

$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/ を参照してください

于 2013-04-05T03:10:41.727 に答える