Предложение MongoDB Java Geospatial Query where

#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"));
}