#java #mongodb #command #geospatial
#java #mongodb #команда #геопространственный
Вопрос:
я использую геопространственный запрос в драйвере mongodb Java для получения местоположений вокруг заданного местоположения, используя следующий код:
BasicDBObject myCmd = new BasicDBObject();
myCmd.append("geoNear", collectionName);
double[] loc = {5,5};
myCmd.append("near", loc);
myCmd.append("spherical", true);
myCmd.append("distanceMultiplier", 6378000);
myCmd.append("maxDistance", 200);
BasicDBList results = (BasicDBList)myResults.get("results");
for( Iterator< Object > it = results.iterator(); it.hasNext(); )
{
BasicDBObject result = (BasicDBObject) it.next();
BasicDBObject dbo = (BasicDBObject) result.get("obj");
System.out.println(dbo.getString("name"));
}
Пока это работает нормально. У меня возникают проблемы с добавлением дополнительных критериев выбора. т. Е. в моей коллекции есть поле с именем category, и я хочу добавить категорию в запрос. например, укажите мне все местоположения, принадлежащие к данной категории.
С нетерпением ждем ваших ответов и подсказок!
БР Мартин
Комментарии:
1. Вы пробовали myCmd.append («запрос»,categoryDocument), где categoryDocument — это документ, представляющий ваш запрос, который, я думаю, вам нужно создать как другой DBObject. Я не использую драйвер Java, поэтому не могу протестировать. Но дополнительная фильтрация определенно выполняется через поле запроса с документом в качестве параметра.
2. привет, Джон, это решило мою проблему!! большое спасибо! бр Мартин
3. Пожалуйста, добавьте свое решение в качестве ответа для другого пользователя.
4. @Martin, я добавил решение на случай, если у кого-то еще возникнет этот вопрос. Не стесняйтесь редактировать его и / или принять, если оно помогло вам и является правильным.
Ответ №1:
Согласно документам geoNear, чтобы ограничить геопространственный запрос некоторыми другими атрибутами, вы добавляете документ в качестве параметра запроса.
BasicDBObject myCmd = new BasicDBObject();
BasicDBObject myQuery = new BasicDBObject();
myCmd.append("geoNear", collectionName);
double[] loc = {5,5};
myCmd.append("near", loc);
myCmd.append("spherical", true);
myCmd.append("distanceMultiplier", 6378000);
myCmd.append("maxDistance", 200);
//construct a query document from another BasicDBOject
myQuery.append("category":"some category");
//add this as a query document
myCmd.append("query", myQuery);
BasicDBList results = (BasicDBList)myResults.get("results");
for( Iterator< Object > it = results.iterator(); it.hasNext(); )
{
BasicDBObject result = (BasicDBObject) it.next();
BasicDBObject dbo = (BasicDBObject) result.get("obj");
System.out.println(dbo.getString("name"));
}