2015-09-20 4 views
0

Я пытаюсь использовать Meteor.publish (на стороне сервера) с этим запросом:MeteorJS опубликовать запрос не работает

return Meteor.users.find({_id:{$ne:this.userId}}); 

Когда я делаю запрос на стороне клиента с Meteor.subscribe, он работает:

return Meteor.users.find({_id:{$ne:Meteor.userId()}}); 

так почему он не работает на стороне сервера ... Кажется, я могу запросить его только после его на стороне клиента ... Проблема в том, что я не хочу загружать всю коллекцию, потому что у меня будет более 20 000 пользователей. Использовать методы публикации не разрешают «$» запросы?

Кроме того, как я могу прикрепить это к моему следующему утверждению запроса:

return Meteor.users.find({"profile.loc":{ $near: [ to[0].profile.loc.lat, to[0].profile.loc.lon ], $maxDistance: (1/111.2)*250}}); 
+0

Все работает должным образом. Если вы не хотите, чтобы все 20000 пользователей были опубликованы на клиенте, вы его не публикуете. Подробнее о публикации/подписке. – ZuzEL

ответ

0

Публикация метод действительно позволяет $ запросы. Ваша публикация публикует все пользователи, чей идентификатор не равен this.userId. Если у вас 20 000 пользователей, этот метод будет публиковать данные для 19999 пользователей.

Если вы хотите опубликовать данные текущего пользователя, то попробуйте:

Meteor.publish('userData', function() { return Meteor.users.find(this.userId) }; 
1

В ответ выше состояний, вы бы все равно опубликовать 19999 пользователей, если вы делаете то, что вы написали.

Ваш вопрос находится в 2-х частях, хотя, и вы действительно должны обращаться как с одним запросом: чтобы сделать это, вы должны иметь публикацию с параметром:

Meteor.publish('users', function(location) { 
     return Meteor.users.find(
         {_id: {$ne: this.userId}, 
          "profile.loc":{ 
          $near: [ location.lat, location.lon ], 
          $maxDistance: (1/111.2)*250} 
          } 
         }); 

Это будет экранировать пользователей на сервере, который может быть сопоставлено с критерии местоположения.

На стороне клиента вы подписались на него с:

location = {lon: 12.123, lat: 110.2}; 
Meteor.subscribe('users', location); 

или объекта по вашему выбору.

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