2013-09-12 2 views
2

У меня есть простой MongoDo Aggregation запрос:MongoDB geoNear Aggregation - Порядок операций

{ 
    "$geoNear": { 
     "near": { 
      "type": "Point", 
      "coordinates": [ 
       -73.982, 
       40.7685 
      ] 
     }, 
     "spherical": "true", 
     "distanceField": "d", 
     "limit": 100000, 
     "maxDistance": 8046.7, 
     "query": { 
      "ipv": 1 
     } 
    } 
}, 
{ 
    "$sort": { 
     "created_at": -1 
    } 
}, 
{ 
    "$limit": 5 
} 

Мой простой вопрос по линии порядка запроса операций. Проверяет ли запрос ВСЕ документы для соответствующих коордов, затем из этого набора данных, соответствует ipv: 1, затем сортируется по create_at, а затем ограничивает 5?

Если так - этого не происходит. У меня есть поле «limit», или оно будет сканировать только 100 последних записей, соответствовать гео-координатам, а затем выполнять порядок операций.

Есть ли способ, чтобы MongoDB просматривал ВСЕ записи для соответствующих GPS-коордов, затем выполнял сопоставление?

ответ

12

Вот как работает $ geoNear: он получает курсор к документам, координаты которых удовлетворяют требованиям maxDistance. Затем он выполняет итерацию над курсором и для каждого документа проверяет, соответствует ли он запросу . Если это не так, оно пропускает его и переходит к следующему документу. Он делает это до тех пор, пока не найдет предел -данные документы или конец курсора. Обратите внимание, что это аргумент для команды $ geoNear, а не для операции $ limit, указанной позже в конвейере агрегации.

по умолчанию предел 100, так что если вы не указываете предела вы получаете первые 100 документов, которые соответствуют запрос и чьи координаты удовлетворяют maxDistance, сортировка этих 100 документов от created_at, и затем с первым 5. При указании предела: 100000, вы получаете первые 100000 документов, которые соответствуют запросу и координаты которых удовлетворяют maxDistance, сортировка этих документов на 100000 created_at, а затем с первой 5.

Если вы пытаетесь получить 5 ближайших документов к своей точке, а затем отсортируйте эти 5 документов с помощью created_at, вы должны установить ограничение $ geoNear на 5 и полностью удалить операцию ограничения $ из конвейера. Если вы хотите отсканировать ВСЕ документы для соответствия координат, отсортируйте полученные документы по created_at, а затем получите первые 5, вы должны установить ограничение $ geoNear на значение, большее размера коллекции, и оставить остальные как у тебя есть это. Надеюсь, это поможет.

+0

Удивительно! Спасибо за объяснение! – 1nstinct

Смежные вопросы