2014-10-26 4 views
0

У меня есть геопространственная коллекция, которую я пытаюсь запросить для результатов в заданном диапазоне. При этом я не могу понять, почему мой запрос возвращает массив результатов без информации. Я пробовал разные способы запуска этого, но всегда получаю те же результаты. Мне нужно знать, что я делаю неправильно, и не могу найти никакой причины, почему это не должно работать.MongoDB geoNear не возвращает результатов

Вот формат документов в коллекции:

{ 
"_id" : ObjectId("54432bd85ae1e944d857659d"), 
"FEATURE_ID" : 406, 
"Location" : { 
    "properties" : { 
     "name" : "Cement Trough Canyon", 
     "mapName" : "Blue House Mountain", 
     "class" : "Valley", 
     "state" : "AZ", 
     "county" : "Navajo", 
     "retrieved" : false 
    }, 
    "geometry" : { 
     "type" : "Point", 
     "coordinates" : [ 
      -110.5126118, 
      33.9950482 
     ] 
     } 
    } 
} 

Вот запрос я пытаюсь запустить:

db.runCommand({ 
    geoNear: "gis", 
    near: { type: "Point", 
    coordinates: [ -110.512612, 33.995048 ] }, 
    spherical: true 
}) 

Здесь индекс, который я создал для коллекции:

{ 
"geometry" : "2dsphere" 
} 

Вот результаты:

{ 
"results" : [], 
"stats" : { 
    "nscanned" : NumberLong(26), 
    "objectsLoaded" : NumberLong(26), 
    "avgDistance" : NaN, 
    "maxDistance" : 0, 
    "time" : 4 
}, 
    "ok" : 1 
} 

В соответствии с этим запрос выполняется нормально, но не отображает данные из объекта в коллекции. Есть ли что-нибудь, что я могу сделать, чтобы исправить эту проблему?

Спасибо!

ответ

2

Проблема заключается в том, что у вас есть геометрия как суб-поле Место, поэтому при запуске

db.gis.ensureIndex({"Location": "2dsphere"}); 

MongoDB создает индекс на местоположение, как если бы это было название вашей области геометрии, несмотря на то, это поле не существует и возвращает OK (что, на мой взгляд, немного запутанно). Для дополнительной иллюстрации этого Гоча, попробуйте следующее:

db.gis.ensureIndex({"i_do_not_exist": "2dsphere"}); 

который будет возвращать что-то вроде следующего, в зависимости от того, сколько индексов у вас уже есть:

{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 2, 
    "numIndexesAfter" : 3, 
    "ok" : 1 
} 

Решение использовать точечную нотацию, чтобы ссылаться на встроенное геометрийное поле, то есть

db.gis.ensureIndex({"Location.geometry": "2dphere"}); 

тогда ваш запрос вернет результат. См. Раздел indexes on sub documents из документации для получения дополнительной информации.

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

db.gis.insert({ 
    "_id" : ObjectId("54432bd85ae1e944d857659d"), 
    "FEATURE_ID" : 406, 
    "Location" : { 
    "properties" : { 
     "name" : "Cement Trough Canyon", 
     "mapName" : "Blue House Mountain", 
     "class" : "Valley", 
     "state" : "AZ", 
     "county" : "Navajo", 
     "retrieved" : false 
    } 
    }, 
    "geometry" : { 
    "type" : "Point", 
    "coordinates" : [ 
     -110.5126118, 
     33.9950482 
    ] 
    } 
}); 

db.gis.ensureIndex({"geometry": "2dsphere"}); 

db.runCommand({ 
    geoNear: "gis", 
    near: { type: "Point", 
    coordinates: [ -110.512612, 33.995048 ] }, 
    spherical: true 
}); 

теперь возвращает вышеупомянутую запись.

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