在mongodb中找不到ipintervals的好索引

时间:2013-01-29 02:48:38

标签: mongodb indexing

我有一个名为“城市”的集合,其中包含城市信息。每个城市文档都有一个内部IpIntervals数组({StartNum,EndNum}),它包含城市的IpIntervals。使用公式256 * 256 * 256 * a + 256 * 256 * b + 256 * c + d计算每个间隔边界,其中“a.b.c.d”是ip地址。要通过IP地址查找位置,我正在使用查询:

{IpIntervals: $elemMatch: {"StartNum": {$lte: <<my_ip_num>>}, "EndNum": {$gte: <<my_ip_num>>}}}}

效果很好,但需要大约270毫秒,所以我想用它来使用一些索引。我尝试了不同的索引,如:

{"IpIntervals.StartNum": 1, "IpIntervals.EndNum": 1}{"IpIntervals.StartNum": -1, "IpIntervals.EndNum": 1}{"IpIntervals.StartNum": 1, "IpIntervals.EndNum": -1}{"IpIntervals.StartNum": 1}

但似乎没有任何效果:它始终是BasicCursor和270ms,这并不好。关于在这种情况下哪种指数适合的任何想法? 感谢名单。

示例数据:

{ 
    "_id" : { "$oid" : "51015e8bd246e8e455ee027d" }, 
    "Name" : "SomeCity", 
    "Latitude" : 28.755787, 
    "Longitude" : 37.617634, 
    "IpIntervals" : [ 
         { "StartNum" : 2457360384, "EndNum" : 2457360639 }, 
         { "StartNum" : 2457361408, "EndNum" : 2457362431 }, 
         { "StartNum" : 2457364480, "EndNum" : 2457366527 }, 
         { "StartNum" : 2461648896, "EndNum" : 2461650943 }
     ] 
}

1 个答案:

答案 0 :(得分:0)

终于找到了解决问题的方法 db.Cities.find({"IpIntervals.StartNum": {$lte: <<my_ip_num>>}}).limit(1).sort({"IpIntervals.StartNum": -1})和索引{"IpIntervals.StartNum": 1}大约需要2毫秒。


由于ip间隔不重叠,我可以订购StartNums并获得最接近my_ip_num的内容。我还没有找到任何查询{IpIntervals: $elemMatch: {"StartNum": {$lte: <<my_ip_num>>}, "EndNum": {$gte: <<my_ip_num>>}}}}

的好索引