Есть ли расстояние в MongoEngine? [Дубликат]

Предположим, вы хотели бы передать String в файл (да, это не имеет никакого смысла), вы не можете использовать его напрямую, потому что класс File не является дочерним, а не родительским классом String (и компилятор жалуется) , Но вы можете использовать String для Object, потому что String - объект (Object is parent). Затем вы можете применить этот объект к файлу, потому что File является объектом. Таким образом, все ваши операции являются «законными» с точки ввода текста во время компиляции, но это не значит, что он будет работать во время выполнения!

File f = (File)(Object) "Stupid cast";

Компилятор позволит это, даже если он не имеет смысл, но он будет сбой при выполнении с этим исключением:

Exception in thread "main" java.lang.ClassCastException:
    java.lang.String cannot be cast to java.io.File
10
задан Blakes Seven 23 November 2015 в 07:04
поделиться

1 ответ

Вы можете использовать этап агрегатного конвейера $geoNear для создания расстояния от запрашиваемой точки:

 db.new_stores.aggregate([
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ -81.093699, 32.074673 ]
        }, 
        "maxDistance": 500 * 1609,
        "spherical": true,
        "distanceField": "distance",
        "distanceMultiplier": 0.000621371
    }}
]).pretty()

Это позволяет указать "distanceField", который будет производить другое поле в выходных документах, содержащих расстояние от запрашиваемой точки. Вы также можете использовать "distanceMultiplier" для применения любого преобразования на выходное расстояние по мере необходимости (т. Е. Метров до миль и отмечая, что все расстояния GeoJSON возвращаются в метрах)

Существует также geoNear ] с аналогичными параметрами, но он, конечно, не возвращает курсор в качестве вывода.

15
ответ дан Hendy Irawan 18 August 2018 в 23:15
поделиться
  • 1
    Большое спасибо, он отлично работает. Любопытно узнать, почему вы умножили его на 1609? – tryingsomethingnew 23 November 2015 в 07:14
  • 2
    @SiMemon Потому что есть 1609 метров в миле, и наоборот / на дистанционном мультипликаторе. Номер 3963, который вы использовали, представляет собой преобразование «радианов». до миль, что при использовании с точками координат GeoJSON было бы неверным. Радианы используются только как с памятью, так и с запросом используют «унаследованные пары координат». – Blakes Seven 23 November 2015 в 07:18
  • 3
    – Dileep Paul 1 October 2018 в 15:15
Другие вопросы по тегам:

Похожие вопросы: