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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
На самом деле немного более оптимальным, чем при первом написании. Теперь мы можем просто $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, поскольку он, вероятно, будет более совместим с другими библиотеками, которые вы могли бы использовать для работы с полученными результатами.
MongoDB обеспечивает надежную поддержку запроса на основе GEO. Чтобы проверить, находится ли ваше местоположение в указанном вами центре, существует $ geoNear .