Така че заявките с двоен диапазон не са препоръчителни в Mongo. Предполагам, че имате един индекс, съдържащ и двете {start_ip_num: 1, end_ip_num: 1}
.
Ако това не ви доближи достатъчно (често все още е бавно, ако имате достатъчно данни, върнати от първото поле, тъй като трябва да извърши много сканиране на B-дърво), има един трик, който можете да направите, за да се борите с това използване на 2D заявки за кутии (работи само за два диапазона наведнъж).
По принцип поставяте 2D географски индекс в поле, съдържащо двете точки в масив, като [start_ip, end_ip], и му давате достатъчно висока минимална/максимална стойност, така че да не достигне границите, които по подразбиране са просто -180/180.
И накрая, използвайте заявка за граници с обхват от min до стойността $lte в единия ъгъл на кутията и gt и максималната стойност в другия ъгъл на кутията. Вижте http://www.mongodb.org/display/DOCS/ Geospatial+Indexing#GeospatialIndexing-BoundsQueries за синтаксис.
Изглежда по следния начин:
db.ip_ranges.find({ip_range:{$within:{$box:[[0, 1204135028], [1204135028, max]]}}});
където max е най-големият ip, който можете да имате.
Измина известно време, откакто гледах това, така че полето може да е грешно, но концепцията е здрава и направи заявките с двоен диапазон да се представят малко по-добре, отколкото с обикновения индекс на B-дърво с две полета. Постоянно под секунда (въпреки че обикновено няколкостотин милисекунди), в сравнение с няколко секунди с обикновения индекс - мисля, че имах стотици милиони документи по това време, но мина известно време, така че вземете тези запомнени показатели внимателно от солта. Сигурен съм, че резултатите ще варират значително в зависимост от вашите данни и размерите на диапазона.
Актуализация: Може да искате да експериментирате с bits
настройка, опитвайки се с ниско и високо число, за да видите дали има разлика. За мен това не изглежда да повлияе средно на заявките. Вижте http://www.mongodb.org/display/DOCS/ Геопространствено+индексиране#GeospatialIndexing-Създаване на индекса
за синтаксис.