2015-07-17 2 views
0

У меня есть коллекция с индексом 2dsphere и вы хотите использовать функции $geoWithin и $centerSphere для запроса.MongoDB геопространственный запрос ничего не возвращает

Отрывок модели:

{ 
// ... 
coordinates: { 
    coordinates: { 
     type: Array, 
     index: '2dsphere' 
    } 
} 
// ... 
} 

Я успешно вставил кучу документов в базу данных, и теперь пытаюсь запросить его с помощью:

Model.find({ 
    coordinates: { 
     coordinates: { 
      $geoWithin: { 
       $centerSphere : [ [ lng, lat], r ] 
      } 
     } 
    } 
}) 

Проблемы я столкнулся в том, что вызов ничего не возвращает, ни ошибка, ни данные. Я попробовал это в mongo shell, а также в моем приложении node.js с долготами и широтами объектов, которые я могу подтвердить, были вставлены в базу данных. Я также попытался использовать $near с $maxDistance с тем же результатом. Кроме того, я переключил широту и долготу, чтобы проверить ... и я преобразовываю r в радианы, делясь на радиус Земли.

Я из идей о том, что пойдет не так на данный момент, и благодарен за любые предложения!

+0

Try "coordinates.coordinates", а не вложенности объектов. Не уверен, почему вы так структурируете этот способ. Но если вы на самом деле не показываете свою полную схему, это является хорошей причиной, почему это потерпит неудачу. Кроме того, хотя это не требуется для '$ geoWithin', вы фактически определили индекс« 2dsphere »? Для оператора '$ geoWithin' вам это не нужно (но это помогает), но для' $ near' или аналогичного вам. –

+0

Спасибо за ваш комментарий. Как показано в Model-выдержке выше я определить '2dsphere' индекс и он будет создан успешно, что я доказал, проверив' db.Model.getIndexes(): { \t \t «V»: 1, \t \t " ключ»: { \t \t \t "coordinates.coordinates": "2dsphere" \t \t}, \t \t "имя": "coordinates.coordinates_2dsphere", \t \t "н.з.": "myDb.myCollection", \t \t "background": true, \t \t "безопасный": нулевой, \t \t "2dsphereIndexVersion": 2 \t} ' Я также попытался с помощью запросов' coordinates.coordinates', что приводит к 'E QUERY SyntaxError: Неожиданное знак .'. – hpd

+0

Умм. Цитаты. поэтому буквально «координаты» согласовываются ». он называется [«точечной нотации»] (http://docs.mongodb.org/manual/core/document/#dot-notation) и как вы явно ссылаетесь на отдельные поля в документе MongoDB на вложенных уровнях. Я уже сказал, что индекс не требуется. –

ответ

0

Я думаю, вы должны изменить свою модель, но использовать "dot notation" вместо:

Model.find({ 
    "coordinates.coordinates": { 
     "$geoWithin": { 
      "$centerSphere" : [ [ lng, lat], r ] 
     }    
    } 
},function(err,callback) { 

}); 
+0

Я понимаю, что наличие поля 'координат' внутри поля' координат' кажется нечетным, но это связано с соответствием сторонним требованиям api. Я мог бы воздержаться от использования внешнего поля 'координат', но потом мне пришлось бы добавлять его к результатам позже, когда передавали их клиенту.Просто потому, что он будет выглядеть так. – hpd

+0

@hpd [C'est La Vie] (https://www.youtube.com/watch?v=SJ5cg0KNKH0) –

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