2016-03-16 2 views
2

Я спасаю некоторые сообщения в виде MongoDB коллекции, как это:

{ 
    "_id": { 
     "$oid": "56e7152edbaacc2ab1d34f20" 
    }, 
    "title": "the title", 
    "body": "the post", 
    "loc": { 
     "lat": 40.616856, 
     "lng": 22.954689 
    }, 
    "timestamp": "1457984814748", 
    "username": "User", 
    "fbID": "4324" 
} 

Я хочу, чтобы получить сообщения, которые вокруг Конкретное соотношение позволяет сказать, что в 2 км.

Я пытаюсь найти, как работает $near, но не может найти документацию об этой функции в mongodb java docs. Если кто-нибудь знает, как я могу это сделать или где я могу найти документацию об этом, мы будем очень благодарны.

Это то, что я пытаюсь до сих пор где texts это коллекция из БД:

 QueryBuilder query = new QueryBuilder(); 
     query.put("loc").near(22.9545545, 40.616479, 50); 
     MongoCursor<Document> cursor2 = texts.find((BasicDBObject) query.get()).iterator(); 
     try { 
      while (cursor2.hasNext()) { 
       Document doc = cursor2.next(); 
       documents.add(doc); 
      } 
     } finally { 
      cursor2.close(); 
     } 

Я также попытался это:

Double locationLongitude = new Double (22.9545545); 
       Double locationLatitude = new Double (40.616479); 
       BasicDBObject locQuery = new BasicDBObject(); 
       locQuery.put("loc", new Document("$near", new Double[]{locationLongitude, locationLatitude})); 
MongoCursor<Document> cursor2 = texts.find(locQuery).iterator(); 
      try { 
       while (cursor2.hasNext()) { 
        Document doc = cursor2.next(); 
        documents.add(doc); 
       } 
      } finally { 
       cursor2.close(); 
      } 

UPDATE

После небольшого исследования i пришли к следующему:

я изменяет свои JSon документы на это:

{ 
    "_id": { 
     "$oid": "56e9e7440296451112edd05d" 
    }, 
    "title": "ρ", 
    "body": "ρ", 
    "lng": 22.954689, 
    "lat": 40.616856, 
    "loc": { 
     "type": "Point", 
     "coordinates": [ 
      22.954689, 
      40.616856 
     ] 
    }, 
    "timestamp": "1458169668154", 
    "username": "User", 
    "fbID": "4324" 
} 

и мой Java-код для этого:

 collection.createIndex(new Document("loc", "2dsphere")); 
     MongoCursor<Document> cursor = collection.find(near("loc", 22.9548626, 40.6159144, 100.0, 0.0)).iterator(); 

     try { 
      while (cursor.hasNext()) { 
       Document doc = cursor.next(); 
       documents.add(doc); 
      } 
     } finally { 
      cursor.close(); 
     } 

Но до сих пор не получают никаких результатов .. курсор не имеет никаких документов. Я также получаю эту ошибку

03-17 01:34:05.489 1786-1805/? W/System.err: com.mongodb.MongoQueryException: Query failed with error code 17007 and error message 'Unable to execute query: error processing query: ns=posts2.texts2 limit=0 skip=0 03-17 01:34:05.489 1786-1805/? W/System.err: Tree: GEONEAR field=loc maxdist=100 isNearSphere=0 03-17 01:34:05.489 1786-1805/? W/System.err: Sort: {} 03-17 01:34:05.489 1786-1805/? W/System.err: Proj: {} 03-17 01:34:05.489 1786-1805/? W/System.err: planner returned error: unable to find index for $geoNear query' on server ds011439.mlab.com:11439

+0

Где ваш код Java? – Saleem

+0

@Saleem я редактировал вопрос.Спасибо за ваш ответ –

+0

В моем json тоже есть изменения. «lng» и «lat» находятся в «loc» –

ответ

0

Я думаю, ваша ошибка здесь
MongoCursor<Document> cursor = collection.find(near("loc", 22.9548626, 40.6159144, 100.0, 0.0)).iterator();

В вашем формате json поле "loc" имеет тип: Poi нт. У функции near есть другой конструктор, который near(String field, Point point, Double max, Double min) Итак, вместо 22.9548626, 40.6159144, вы должны использовать Point.

Вы можете создать точку, как это:

Position position = new Position(22.9548626,40.6159144); 
Point point = new Point(position); 

Here является documenation.

Дайте ему попробовать.

0

Я отправляю вам раскошелиться запрос, чтобы помочь вам понять, как $ возле работы.

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

db.loc.createIndex({loc:"2dsphere"}) 

После создания индекса, выполнить следующий запрос

db.loc.find(
    { 
    loc: 
     { $near : 
      { 
      $geometry: { type: "Point", coordinates: [ 40.617856, 22.954689 ] }, 
      $maxDistance: 2000 
      } 
     } 
    } 
) 

Он будет искать все местоположение с в 2000 метров (2 км)

+0

Я обновил свой вопрос, вы можете мне помочь, с какой ошибкой? Я думаю, что приближаюсь. Спасибо за ваши усилия :) –

+0

Для запуска запросов GeoSpatial вам нужно сначала создать «2dsphere». Это обычная работа. – Saleem

+0

Я думаю, что я создаю 2-й секторный индекс в 'collection.createIndex (новый документ (« loc »,« 2dsphere »)),' no? –

Смежные вопросы