Наверняка есть способ сначала вернуть самые дальние элементы, а именно использовать $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
, мы могли ожидать другого.
Но это процесс. И может быть, если вы, казалось бы, надвигаетесь «Возьми меня как можно дальше отсюда!» приложение действительно делает всплеск в мире, тогда, возможно, действительно, мы все будем думать об этом с вами.
Большое спасибо за столь подробный ответ! – fgalan