2016-11-17 3 views
0

У меня есть публикации, которая возвращает курсор, который выглядит следующим образом:Повторное использование Meteor Observer: изменит ли мой запрос на возврат публикации, чтобы не использовать this.userId сделать мой наблюдатель более многоразовым?

// Publication RETURNS THIS QUERY 

Notepads.find({_id: notepadId, $or: [{userId: this.userId}, {'collaborators.userId': this.userId}], archived: false}) 

Как вы можете видеть, что запрос является уникальным для пользователя, так как он включает в себя this.userId

я использую this.userId в публикации в форме безопасности. Вы получите только данные, если вы связаны с этим конкретным блокнотом.

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

// Optimized publication 

notepad = Notepads.findOne({_id: notepadId, $or: [{userId: @userId}, {'collaborators.userId': @userId}], archived: false}) 

if notepad? 
    // Optimized publication RETURNS THIS QUERY 
    return Notepads.find({_id: notepad._id, archived: false}) 
else 
    return 

Я думаю, что это средство повторного использования наблюдателя. То, что публикация возвращает тот же запрос для любого пользователя, который подписывается на него. Так ли это правильно, эта оптимизация стоит того изменения?

ответ

0

Quoting from kadira.io on How Observers are Handled in Meteor:

В целях создания одинаковых наблюдателей, необходимо создавать курсоры с:

  • той же коллекции
  • тот же селектор (запроса)
  • тот же набор (включая сортировку, лимит и т. д.)

В вашем примере селектор не одинаковый для разных пользователей.

Селекторы Object Literals и оцениваются перед передачей в вызов .find. Это означает, что {_id: notepad._id, archived: false} становится

  • {_id: 'myNotebookID', archived: false} или
  • {_id: 'anotherNotebookId', archived: false}.

Как вы можете видеть, это разные селекторы после того, как вы разрешите notepad._id, и это происходит до передачи в .find().

Если ваш первый запрос db возвратил тот же блокнот, потому что ваш второй пользователь был сотрудником в ноутбуке первого пользователя, вы попали бы в один и тот же селектор и один курсор/наблюдаемый. Однако для большинства приложений это вряд ли будет достаточно распространено для оптимизации, тем более что (как указывает @Khang) вы потеряете реактивность.

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

+0

привет. Я запутался. Можете ли вы еще раз взглянуть на оптимизированный запрос, который я сделал. Я сделал точно так, как ты сказал. Если сначала найдите блокнот, я верну курсор 'return Notepads.find ({_ id: notepad._id, archived: false})' Это изменение, которое я сделал – nearpoint

+0

, за подробный ответ! Это хороший материал. Но я хочу уточнить один момент. Если многие пользователи сотрудничают в одном блокноте (тот же notepad._id), не изменилось бы это изменение? Что касается реактивности, код настраивается таким образом, что пользователь будет подписываться только после того, как он будет сотрудником. И если они будут удалены в качестве соавтора, в то время как они находятся в блокноте, он все равно синхронизирует блокнот, а на клиенте я могу посмотреть блокнот и прекратить подписку, если они больше не будут взаимодействовать. Так что, учитывая эти случаи, стоит ли это изменить? – nearpoint

+0

Я думаю, стоит ли оптимизировать, если говорить о типичном сотрудничестве между блокнотами между 5 пользователями? 10 пользователей? 40 пользователей? Наверное, я бы предпочел не делать оптимизацию, если это практически не имеет никакого значения, и я теряю реактивность. – nearpoint

0

Есть проблемы с вашей оптимизированной версией, то есть не реагирует. Поскольку вы используете Notepads.findOne в качестве проверки безопасности, чтобы убедиться, что у пользователя есть доступ к документу.

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

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

  • Нет связанных вопросов^_^