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

    }
}    

誰かがこれを説明できますか?素晴らしいTHX!

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 インデックスを使用している場合、Explain には次のものが含まれている必要があります。

"cursor" : "GeoSearchCursor"

2.2.0 にアップグレードすることで本当に問題が解決したか確認できますか? :)

サンダー

于 2012-11-10T02:10:01.910 に答える