当我在严格的客户端集合上调用更新/插入时会发生啥?

Posted

技术标签:

【中文标题】当我在严格的客户端集合上调用更新/插入时会发生啥?【英文标题】:What happens when I call update/insert on a strictly client side collection?当我在严格的客户端集合上调用更新/插入时会发生什么? 【发布时间】:2012-05-26 08:57:05 【问题描述】:

如果我使用 Meteor.publish 将文档推送到客户端集合(如“消息计数”示例中),那么当我在该客户端集合(称为“消息计数”)上插入/更新/删除时会发生什么“在文档中的示例中)? 考虑到服务器上甚至不存在“消息计数”集合,是否有任何东西到达服务器?在这种情况下,我们如何将文档更改传播到服务器?

注意:我看过@debergalis 的出色回答,他详细解释了这个例子(这里:https://***.com/a/10566873/694222),这很有意义。但它没有涉及调用客户端集合(在他的示例中为“计数”)以插入/更新文档时会发生什么。

更新:

所以我自己尝试了一下,结果如下: 如果我有一个名为 Counts 的客户端集合(使用 Meteor.publish 填充),那么 Counts.find 工作正常,但 Counts.insert 根本不起作用,说没有找到相关的 Meteor.method,这很好。

但现在我遇到了一个新问题。如果我订阅的客户端集合与发布的服务器端集合具有相同的名称(我已经删除了自动发布流星包),那么执行插入客户端确实会传播到服务器端并将文档添加到服务器端 mongo。这显然是不可接受的..

所以基本上,具有相同名称的客户端集合(您传递给新 Meteor.Collection 的内容)可以成功更新具有相同名称的服务器端集合,即使关闭了自动发布包。这是一个错误吗?

【问题讨论】:

在客户端和服务器上对不相关的集合使用相同的集合名称似乎令人困惑。有必要吗? 【参考方案1】:

messages-count 不是一个集合,它是包含单个属性的单个记录的记录集。

您将房间 ID 传递给它,它会返回它的计数;你不能用那个记录集做更多的事情......

【讨论】:

【参考方案2】:

如果我使用 Meteor.publish 将文档推送到客户端集合 (就像在“消息计数”示例中一样),那么当我 该客户端集合上的插入/更新/删除(称为 文档示例中的“消息计数”)?

API 文档中的“messages-count”示例使用“命名”集合。集合名称是“messages-count”。所有命名集合都存在于服务器端。当您插入/更新/删除客户端时,更改会自动传播到服务器集合。

以下是 API 文档的摘录:

如果您在创建集合时传递了一个名称,那么您就是 声明一个持久化集合——一个存储在服务器上的集合 并被所有用户看到。客户端代码和服务器代码都可以访问 使用相同 API 的相同集合。

下一个问题:

考虑到“消息计数”,是否有任何内容到达服务器 服务器上什至不存在集合?

该集合确实存在于服务器上(见上文),所以是的,客户端集合上的所有插入/更新/删除都将传播到服务器。

在这种情况下,我们如何将文档更改传播到服务器?

如果您确实有一个仅限客户端的集合(例如,使用空名称创建的集合),那么您必须将什么传播到服务器?如果您希望传播更改,请使用命名集合。

【讨论】:

没有名为“messages-count”的集合。集合“counts”仅在客户端由new Meteor.Collection('counts') 定义,并由名为“counts-by-room”的发布/订阅对在客户端填充。 'counts' 中的任何内容都不会传播到服务器,因为服务器上不存在响应处理该集合的客户端请求的方法。

以上是关于当我在严格的客户端集合上调用更新/插入时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当我在 NULL 对象指针上调用成员函数时会发生啥? [复制]

当我在 Windows 上的 HID 设备上执行 ReadFile() 时会发生啥?

当我在两台不同的电脑上使用 BitTorrent 下载相同的 torrent 文件并使用相同的互联网连接时会发生啥?

当我的镜像的基础镜像更新时会发生啥?

在 iPhone 或 iPad 应用程序中调用 main 时会发生啥?

当我在给定的 Cassandra 集群中“从 ColumnFamily 中选择 *”时会发生啥