使用其他条件,使Mongodb $接近搜索

时间:2012-10-31 09:04:31

标签: mongodb geo

我有一个集合,数据看起来像这样:

{
    "_id" : ObjectId("4e627655677c27cf24000000"),
    "gps" : {
        "lng" : 116.343079,
        "lat" : 40.034283
    },
    "lat" : 1351672296
}

我建立了一个复合索引:

{
    "v" : 1,
    "key" : {
        "gps" : "2d",
        "lat" : 1
    },
    "ns" : "test.user",
    "name" : "gps__lat_1"
}

如下所示的纯$ near查询可以非常快(<20ms):

>db.user.find({"gps":{"$near":{"lng":116.343079,"lat":40.034283}}}).explain()
{
    "cursor" : "GeoSearchCursor",
    "nscanned" : 100,
    "nscannedObjects" : 100,
    "n" : 100,
    "millis" : 23,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {

    }
}

但是带有“lat”标准的查询非常慢(900ms +):

>db.user.find({"gps":{"$near":{"lng":116.343079,"lat":40.034283}},"lat":{"$gt":1351413167}}).explain()
{
    "cursor" : "GeoSearchCursor",
    "nscanned" : 3,
    "nscannedObjects" : 3,
    "n" : 3,
    "millis" : 665,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {

    }
}    

有人可以解释一下吗?太棒了!

2 个答案:

答案 0 :(得分:0)

我将Mongodb更新到2.2.0,问题消失了。

127.0.0.1/test> db.user.find({gps:{$near:[116,40]},lat:{$gt:1351722342}}).explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 0,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 0,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {

    },
    "server" : "zhangshenjiamatoMacBook-Air.local:27017"
}

答案 1 :(得分:0)

从上面的解释来看,它看起来并不像geoIndex一样 - 而且,看起来上面的查询没有返回任何结果!

如果您的查询使用的是2d索引,则说明应包含:

  

“cursor”:“GeoSearchCursor”

您能否检查升级到2.2.0是否真的解决了您的问题? :)

孙大信