MongoDB $ ближний запрос с использованием драйвера Java - PullRequest
3 голосов
/ 19 февраля 2012

У меня есть несколько магазинов с продуктами в моей базе данных MongoDB в соответствии с этой моделью данных: Магазин {idShop, имя, местоположение {lat, lon}, products [] of int} Если я запускаю следующую команду в консоли mongoDB по умолчанию:

db.shops.find ({products: 1, location: {$ near: [41.391204,2.145381]}}). Limit (300)

донайти магазины, у которых товар № 1 упорядочен по расстоянию. Я получаю следующие результаты:

{"_id": ObjectId ("4f410cefe4b03a0e3cff6f5a"), "name": "Shop1", "location":{"lat": 41.389915, "lon": 2.135628}, "products": [1, 5, 4]}

{"_id": ObjectId ("4f410cefe4b03a0e3cff6f59"), "name": "Shop2Center "," location ": {" lat ": 41.388191," lon ": 2.128816}," products ": [1, 2, 3]}

{" _id ": ObjectId (" 4f410cefe4b03a0e3cff6f5c "), "name": "Shop3", "location": {"lat": 41.384712, "lon": 2.172031}, "products": [6, 1]}

{"_id": ObjectId ("4f410cefe4b03a0e3cff6f5d"), "name": "Shop4", "location": {"lat": 41.384029, "lon": 2.173936}, "products": [6, 1, 2, 3, 4, 5]}

Теперь я хочу получить те же результаты, ноиспользуя мой Java сервлет.Если я ищу только по номеру продукта, результаты в порядке, но не отсортированы.Затем, если я пытаюсь отсортировать их, добавив новое условие ключ / значение, оно ничего не возвращает.Я использую следующий код:

BasicDBObject query = new BasicDBObject ();

query.put ("products", Integer.parseInt (idProduct));

QueryBuilder query2 = new QueryBuilder ();

query2.near (Double.parseDouble (lat), Double.parseDouble (lon));

query.putAll (query2.get ());

curShops = collShops.find (query);

Возвращает пустой JSON.Я также пробовал другие способы, такие как:

BasicDBObject query = new BasicDBObject ();

query.put ("products", Integer.parseInt (idProduct));

ArrayList ar = new ArrayList (2);

ar.add (Double.parseDouble (lat));

ar.add (Double.parseDouble (lon));

query.put ("location", новый BasicDBObject ("$ near", ar));

curShops = collShops.find (query);

безУдачи.

Кто-нибудь может мне помочь с этим?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

У меня нет опыта работы с драйвером Java, но мне кажется, проблема в этой строке

 query2.near(Double.parseDouble(lat), Double.parseDouble(lon));

В соответствии с mongodb документацией,

Код предполагает, что вы используете десятичные градусы в (долгота, широта) порядок. Этот же порядок используется для спецификации GeoJSON. Использование (широта, долгота) приведет к очень неправильным результатам, но часто порядок используется в другом месте, поэтому хорошо перепроверить

Также из java mongodb-api-doc вы можете увидеть

рядом

public QueryBuilder near(double x,
                         double y)

Эквивалент $ близкого операнда

Параметры:

х - х координата

y - y координата

x-cordinate обозначает долготу здесь. Таким образом, координаты местоположения должны быть переданы как [lon,lat] вместо [lat,lon]

Измените ваш запрос на

 query2.near(Double.parseDouble(lon), Double.parseDouble(lat));

чтобы заставить это работать

0 голосов
/ 02 апреля 2012

Да, это довольно просто. Я только что опубликовал пример, который должен помочь вам найти решение на http://chuckjohnson.wordpress.com/ - см. http://chuckjohnson.wordpress.com/2012/04/02/geospatial-location-based-searches-in-mongodb-part-2-simple-searching/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...