我有一个名为 Cities 的集合,其中包含城市信息。每个城市文档都有一个内部 IpIntervals 数组 ({StartNum, EndNum}),其中包含城市的 IpIntervals。使用公式 256 * 256 * 256 * a + 256 * 256 * b + 256 * c + d 计算每个间隔边界,其中“abcd”是 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 }
]
}