2015-01-24 2 views
0

Я пытаюсь найти «место», которые находятся рядом с местом и встретиться с некоторыми другими критериями, как показано здесь:

var places = Places.find(
{ 
    $and : 
    [ 
     { categories : placesCategory }, 

     { 
      $or : 
      [ 
       { name : { $regex : searchQuery, $options : 'i' } }, 
       { city : { $regex : searchQuery, $options : 'i' } }, 
       { country : { $regex : searchQuery, $options : 'i' } } 
      ] 
     }, 

     { 
      location : 
      { 
       $near : [ nearLng, nearLat ], 
       $maxDistance : 67.15 // radians 
      } 
     } 
    ] 
}).fetch(); 

Однако консоль говорит мне, что «$ рядом не может находиться внутри другого оператора $ ".

Есть ли способ включить $ рядом с $ и?

Или что было бы лучше?

+0

Это не проблема. Как я уже сказал, консоль говорит, что «$ рядом не может быть внутри другого оператора $» – miclaus

+0

взгляните на [это] (http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/#pipe ._S_geoNear) – Ethaan

ответ

0

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

var places = Places.find(
{ 
    location : 
    { 
     $near : [ nearLng, nearLat ], 
     $maxDistance : 67.15 // radians 
    }, 
    $and : 
    [ 
     { categories : placesCategory }, 

     { 
      $or : 
      [ 
       { name : { $regex : searchQuery, $options : 'i' } }, 
       { city : { $regex : searchQuery, $options : 'i' } }, 
       { country : { $regex : searchQuery, $options : 'i' } } 
      ] 
     } 
    ] 
}).fetch(); 

Я, однако, не уверен, работает ли ваш запрос $ near. Я предпочитаю более конкретный запрос с параметром «2dsphere» в координатах. Например:

location: 
{ 
    $near: 
    { 
     $geometry: 
     { 
      type: 'Point', 
      coordinates: [ nearLng, nearLat ] 
     }, 
     $maxDistance: 67.15 // radians 
    } 
} 

EDIT: Для того, чтобы использовать приведенный выше запрос, убедитесь, что вы сохраняете ваши данные в соответствии с этой моделью:

location: { 
    type: { 
     type: String, 
     enum: 'Point', 
     default: 'Point' 
    }, 
    coordinates: { 
     type: [Number], 
     default: [0,0], 
     index: '2dsphere' 
    } 
} 

Если вы хотите, чтобы найти места внутри прямоугольника , вам, вероятно, понадобится оператор $. Это пример поискового запроса (обратите внимание, у меня нет опыта работы с ним Вы, возможно, потребуется изменить модель и/или добавить индекс для улучшения запроса.):

location: { 
    $geoWithin: { 
     $box: [ 
      [ <bottom left coordinates> ], 
      [ <upper right coordinates> ] 
     ] 
    } 
    } 
} 

Позвольте мне знать, если это помогает!

+0

Вы только что сэкономили мне около 70 строк кода. Благодаря! Я также попробовал второе предложение, однако оператор $ geometry не распознается. Я думаю, что это требует лишь незначительных изменений. Я также попытаюсь реализовать что-то вроде «внутренних границ». У вас есть что-то на уме, как я могу найти Locations внутри прямоугольника/внутри границ? – miclaus

+0

Нет проблем! Я обновил свой ответ. Второй запрос, вероятно, не работает, потому что ваша модель «неправильная», я включил свой способ хранения данных. Я также добавил пример поиска внутри прямоугольника, но у меня нет опыта с этим, если честно. Удачи! –

+0

Работал как шарм! Я буду использовать оба решения. Благодаря! – miclaus

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