0

mongod.log 显示:

 {deliver_area: { $geoIntersects:
     { $geometry: { 
         type: "Point", 
         coordinates: [ 116.3426399230957, 39.95959281921387 ] 
     } } 
 } }

 ntoreturn:0 
 ntoskip:0
 nscanned:2965
 keyUpdates:0
 numYields: 2 locks(micros)
 r:136723
 nreturned:52
 reslen:23453
 103ms

该集合有大约 10k 条记录,其中deliver_area一个字段是 Polygon(GeoJSON) 并具有2dsphere索引

这是我的查询:

db.area_coll.find( { 
    id: 59, 
    deliver_area: { 
        $geoIntersects: { 
            $geometry: { 
                type: "Point", 
                coordinates: [ 116.3175773620605, 39.97607231140137 ] 
            } 
        } 
    } 
})

解释结果:

{
    "cursor" : "S2Cursor",
    "isMultiKey" : true,
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 3887,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 3887,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 5,
    "indexBounds" : {
    },
    "nscanned" : 3887,
    "matchTested" : NumberLong(666),
    "geoTested" : NumberLong(0),
    "cellsInCover" : NumberLong(1),
    "server" : "testing:27017"
}
4

1 回答 1

1

日志中的查询与您运行的查询不匹配,位置不同:

[ 116.3426399230957, 39.95959281921387 ]对比
[ 116.3175773620605, 39.97607231140137 ]

我也不认为您已经复制了整个日志行,因为它只是提到area而不是deliver_area.

但是,它们并不。在第一种情况下,它花费了 103 毫秒,在某些情况下,这可能会发生在您的服务器正在执行其他 IO 时。explain()输出告诉您,第二个查询花费了 5 毫秒。

但最引人注目的是,您的主要标准是id: 59。我不知道你的_id字段是什么,但是如果你设置了一个索引,id那么这甚至根本不需要使用2dsphere索引——除非你当然有很多文档 where id=59. 在这种情况下,您最好使用复合键 on { id: 1, deliver_area: '2dsphere' }

于 2013-08-05T09:57:11.450 回答