0

我有一个出版物,它返回一个看起来像这样的游标:

// 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

我认为这就是观察者重用的意思。该发布为订阅它的任何用户返回完全相同的查询。那么这是否正确,这种优化值得改变吗?

4

2 回答 2

0

引用 kadira.io 关于如何在 Meteor 中处理观察者:

为了创建相同的观察者,您需要创建游标:

  • 同一个集合
  • 相同的选择器(查询)
  • 同一组选项(包括排序、限制等)

在您的示例中,不同用户的选择器不同。

选择器是对象文字,在传递给 .find 调用之前会进行评估。这意味着{_id: notepad._id, archived: false}变成

  • {_id: 'myNotebookID', archived: false}, 或者
  • {_id: 'anotherNotebookId', archived: false}.

如您所见,这些是您解析后的不同选择器notepad._id,这发生在传递给 .find() 之前。

如果您的第一个数据库查询返回了相同的记事本,因为您的第二个用户是第一个用户笔记本上的协作者,那么您最终会得到相同的选择器和单个光标/可观察对象。然而,对于大多数应用程序来说,这可能不够普遍,无法优化,尤其是(正如@Khang 指出的那样)你将失去反应性。

所以,这不是同一个查询,它不会重用观察者,也不值得改变。

于 2016-11-18T01:37:02.893 回答
0

您的优化版本存在问题,即它不是反应式的。因为您Notepads.findOne用作安全检查以确保用户可以访问文档。

内部发布.findOne不是响应式的,例如在执行发布时,用户无权访问文档,因此不会向客户端发送任何内容,然后将用户添加为协作者,但这没有任何改变,因为发布将重新运行。

于 2016-11-18T02:04:38.433 回答