2015-05-06 3 views

ответ

2

Вы, вероятно, не хотят mapReduce в этом случае, но на самом деле в aggregation framework. Помимо общего запроса первого этапа, вы можете запускать через $geoNear, который более эффективен в вашей цели.

db.places.aggregate([ 
    { "$geoNear": { 
     "near": { 
      "type": "Point", 
      "coordinates": [ -88 , 30 ] 
     }, 
     "distanceField": "dist" 
    }}, 
    { "$match": { 
     "loc": { 
      "$centerSphere": [ [ -88 , 30 ] , 0.1 ] 
     } 
    }} 
]) 

Или откровенно, потому что первоначальный $geoNear этап будет «проект» дополнительное поле в документ, содержащий «расстояние» от запрошенных «мест происхождения», то вы можете просто «фильтр» на этом элемент в последующий этап:

db.places.aggregate([ 
    { "$geoNear": { 
     "near": { 
      "type": "Point", 
      "coordinates": [ -88 , 30 ] 
     }, 
     "distanceField": "dist" 
    }}, 
    { "$match": { 
     "dist": { "$lte": 0.1 } 
    }} 
]) 

Поскольку это один вариант, который может «произвести/проект» значение, представляющее расстояние в результате то, что удовлетворяет свои первые критерии. «Цепочный» характер «структуры агрегации» позволяет «дополнительную фильтрацию» или любую другую операцию, которую необходимо выполнить после фильтрации исходного запроса.

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

Поскольку ваше требование - это «расстояние» от места происхождения, то наиболее логичным является выполнение операции, которая вернет такую ​​информацию. Как это делает.

Хотелось бы включить все соответствующие ссылки в этот ответ, но, как новый ответчик, тогда две ссылки - это все, на что мне разрешено. более


Одна соответствующая пометка:

Измерение «расстояния» или «радиус» в любой операции зависит от того, как хранятся ваши данные. Если он находится в формате «наследие» или «ключ/пара или простой массив», тогда значение будет выражено в «радианах», в противном случае, когда данные выражаются в формате GeoJSON в «местоположении», тогда «данные расстояния» выраженное в «метрах».

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

+0

Мне действительно нужна работа с mapreduce, а не структура агрегации. Может быть, название должно быть «как получить расстояние между двумя точками на земле с lng и lat?» mongodb решил эту проблему. Итак, я хочу знать, как он решил эту проблему. – cola

+0

@cola Проблема в том, что только операция '$ geoNear', упомянутая и другая отдельная командная форма geoNear, - единственный способ вернуть проецируемое« расстояние »между точкой, и нет способа вызвать это с помощью mapReduce. Я мог заметить, что вы действительно не просите ничего, кроме «как вернуть расстояние», что, конечно, имеет место. Для расчета расстояния в противном случае вам необходимо будет указать необходимый код JavaScript. Скорее всего, агрегирование будет лучшим подходом к тем результатам, которые вы хотите в любом случае. Это, конечно, быстрее. –

+0

Большое спасибо за вашу помощь! Но мне действительно нужно «как получить расстояние или радиан между двумя точками на земле с lng и lat?» , Мое кластер - кластер хаопов вместо mongodb. Моя задача - автономный и пакетный процесс. Итак, я уверен, что мне не нужен mongodb. Я попытался найти «как получить расстояние или радиан между двумя точками на земле с lng и lat?» в источнике mongodb, но не найти. Итак, мне нужна помощь. – cola