2

我有一个集合,数据如下所示:

{
    "_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" : {

    }
}    

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

4

2 回答 2

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"
}
于 2012-11-01T09:35:18.367 回答
0

从上面的解释来看,geoIndex 似乎根本没有被使用——而且,上面的查询似乎没有返回任何结果!

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

“光标”:“地理搜索光标”

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

桑达尔

于 2012-11-10T02:10:01.910 回答