Запрос Mongodb для поиска, если точка находится в динамических полях [duplicate]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

1
задан Neil Lunn 27 January 2015 в 05:46
поделиться

2 ответа

На самом деле немного более оптимальным, чем при первом написании. Теперь мы можем просто $redact , а не $project булевым и $match позже:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius and remove if not
    { "$redact": {
        "$cond": {
            "if": { "$lte": [ "$distance", "$radius" ] },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Вы точно сохранили информацию, как вы должны, но есть другой подход к получению результатов, чем вы думаете.

То, что вы хотите использовать, - это $geoNear и, в частности, структуру агрегации этого оператора. Вот что вы делаете:

db.collection.aggregate([
    // Match documents "near" the queried point
    { "$geoNear": {
        "near": {
            "type": "Point",
            "coordinates": [ 23.027573, 72.50675800000001 ],
        },
        "distanceField": "distance"
    }},

    // Calculate if distance is within radius
    { "$project": {
        "location": 1,
        "radius": 1,
        "distance": 1,
        "within": { "$lte": [ "$distance", "$radius" ] }
    }},

    // Match only documents within the radius
    { "$match": { "within": true } }
])

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

Затем вы используете логическое сравнение, чтобы увидеть, меньше ли значение «расстояние», чем «радиус», поэтому в пределах круга.

Наконец, вы должны отфильтровывать только те результаты, в которых это «внутри» утверждение [true].

Вы можете добавить другие опции в $geoNear, как показано в документации. Я также настоятельно рекомендую, чтобы ваше хранилище также использовало формат GeoJSON, поскольку он, вероятно, будет более совместим с другими библиотеками, которые вы могли бы использовать для работы с полученными результатами.

7
ответ дан Neil Lunn 19 August 2018 в 01:01
поделиться

MongoDB обеспечивает надежную поддержку запроса на основе GEO. Чтобы проверить, находится ли ваше местоположение в указанном вами центре, существует $ geoNear .

1
ответ дан Mayur 19 August 2018 в 01:01
поделиться
Другие вопросы по тегам:

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