MongoDB范围外查询

MongoDB范围外查询,mongodb,Mongodb,我正在尝试查询MongoDB以获得如下信息: “获取年龄不在[30,40]范围内的人员” 我正在做: db.persons.find({'age' : {$nin : [{$lt : 30},{$gt : 40}]}}) 这对我不起作用。我知道我可以像40岁的人那样做,但我想知道我是否可以使用“不在”操作符。。。 谢谢像这样使用电脑怎么样: db.persons.find($or: [{'age': {$lt: 30}},{'age': {$gt : 40}}]) 使用类似这样的工具怎么样:

我正在尝试查询MongoDB以获得如下信息:

“获取年龄不在[30,40]范围内的人员”

我正在做:

db.persons.find({'age' : {$nin : [{$lt : 30},{$gt : 40}]}})
这对我不起作用。我知道我可以像40岁的人那样做,但我想知道我是否可以使用“不在”操作符。。。 谢谢

像这样使用电脑怎么样:

db.persons.find($or: [{'age': {$lt: 30}},{'age': {$gt : 40}}])
使用类似这样的工具怎么样:

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"
}

有关有效查询的详细信息,请参见

$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"
}
有关有效查询的更多信息,请参阅