Геопространственный запрос MongoDB с $ not - PullRequest
8 голосов
/ 14 ноября 2011

У меня есть базовый геопространственный запрос, работающий хорошо в MongoDB.Кажется, применить $, чтобы получить комплемент, должно быть легко, но у меня это не работает.Это простая ошибка пользователя?Или MongoDB не может обработать этот запрос концептуально?Я не смог найти такого ограничения в документации .

Рабочий запрос (правильно находит 2 города в пределах 10 миль от центра):

db.customers.find({ "location" : { $within : { $center : [[-117.15,32.72],0.15] } } })

Попытка дополнениязапрос (желаемый результат - 1 город, который не находится в пределах 10 миль):

db.customers.find({ "location" : { $not : { $within : { $center : [[-117.15,32.72],0.15] } } } })
error: {
    "$err" : "missing geo field (location) in : {location: { $not: { $within: { $center: [ [ -117.15, 32.72 ], 0.15 ] } } } }",
    "code" : 13042
}

Для тех, кто хочет скопировать / вставить запрос, чтобы увидеть ошибку, вот небольшой пример данных:

db.customers.ensureIndex( { "location" : "2d" } )
db.customers.save({"city":"La Mesa","state":"CA","location":[ -117.02,32.76 ]})
db.customers.save({"city":"Chula Vista","state":"CA","location":[ -117.08,32.63 ]})
db.customers.save({"city":"Mexico City","state":"Mexico","location":[-99.133244,19.4326]})

(я использую MongoDB 1.8.2 на случай, если это имеет значение.)

1 Ответ

5 голосов
/ 14 ноября 2011

Я думаю, что это невозможно. Насколько я знаю, запросы местоположения дадут вам специальный курсор, который может использовать только запросы местоположения в качестве параметров (например, $within).

v. 2.0.1 дает более описательное сообщение об ошибке: error: { "$err" : "geo field only has 1 element", "code" : 13068 }

Проблема с индексированием заключается в том, что в общем случае отрицание равно ЗЛО . Большинство индексов плохо справляются, когда вы их переворачиваете, поэтому, даже если ваш запрос сработал, это, вероятно, нежелательно, поскольку, вероятно, придется выполнять сканирование таблицы.

Я не совсем уверен в этом, сообщение для группы новостей, вероятно, хорошая идея.

...