2016-02-23 2 views
3

Согласно MongoDB documentation в $ возле оператора сортировать по расстоянию:

$ ряда видов документов по расстоянию

Для того, слов, ближайших к опорному точка в запросе - это первый возвращаемый элемент.

Есть ли способ зарезервировать заказ? Я имею в виду, чтобы сначала вернуть самый дальний элемент.

ответ

4

Наверняка есть способ сначала вернуть самые дальние элементы, а именно использовать $geoNear с каркасом агрегации. Но есть, конечно, «улов», поскольку то, что вы просите, на самом деле является антитезой того, для чего обычно используется эта функция поиска.

В качестве начального этапа трубопровода задача заключается в возврате результатов с обязательным проецируемым полем «расстояние» из запрошенной точки. Затем вы можете добавить этап конвейера $sort, который вернет «расстояние» в «порядке убывания». Быть тогда «самым большим» и, следовательно, «самым дальним» расстоянием от точки.

В основном в форме, как это, и отмечая «улов»:

db.collection.aggregate([ 
    { "$geoNear": { 
     "near": { 
      "type": "Point", 
      "coordinates": [longitude,latitude] 
     }, 
     "spherical": true, 
     "distanceField": "distance", 
     "limit": 999999     // <-- That's the one! 
    }}, 
    { "$sort": { "distance": -1 } } 
]) 

Итак, когда вы смотрите на что вы видите "near" вариант, который должен быть сам объяснительный, а также "spherical" что, конечно dicerns между индексами «2d» и «2dsphere». Существует также, как упоминалось, "distanceField", который требуется здесь, и будет курсом в документе, где записано рассчитанное расстояние. Но есть еще один важный вариант.

Как уже отмечалось, общее намерение является ближайшего, и как таковые большинство запросов такого рода лучше всего от возвращения только суб-набор данных, который действительно «ближайший» к запрошенной точке. Это означает "limit" о возвращенных документах. Взгляд на документации покажет типичное «по умолчанию» 100.

Так, так как идея в случае обратного, то, что вы должны предназначаться этим число, которое является больше чем полные документы в коллекция. Это позволит проверить всю коллекцию по этапу трубопровода, в результате чего рассчитывается расстояние для каждого документа. Тогда, конечно, это просто до $sort, чтобы сделать это и вернуть документы в «самом отдаленном» порядке.


Действительно ли это оптимально? Ну, конечно, это не так, и правильно, так как вы просто попросили полную противоположность тому, что «рядом» означает слово. Если бы существовал «встроенный» оператор $far или $geoFar, мы могли ожидать другого.

Но это процесс. И может быть, если вы, казалось бы, надвигаетесь «Возьми меня как можно дальше отсюда!» приложение действительно делает всплеск в мире, тогда, возможно, действительно, мы все будем думать об этом с вами.

+0

Большое спасибо за столь подробный ответ! – fgalan

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