Meteor 如何接收对 MongoDB 查询结果的更新?

Posted

技术标签:

【中文标题】Meteor 如何接收对 MongoDB 查询结果的更新?【英文标题】:How does Meteor receive updates to the results of a MongoDB query? 【发布时间】:2012-04-23 14:47:47 【问题描述】:

几个月前我问了一个问题,Meteor 似乎有答案。

Which, if any, of the NoSQL databases can provide stream of *changes* to a query result set?

谢谢,

克里斯。

【问题讨论】:

【参考方案1】:

为此,您需要query.observe()。假设您有一个带有标签字段的 Posts 集合,并且您希望在添加带有 important 标签的帖子时收到通知。

http://docs.meteor.com/#observe

// collection of posts that includes array of tags
var Posts = new Meteor.Collection('posts');

// DB cursor to find all posts with 'important' in the tags array.
var cursor = Posts.find(tags: 'important');

// watch the cursor for changes
var handle = cursor.observe(
  added: function (post)  ... , // run when post is added
  changed: function (post)  ...  // run when post is changed
  removed: function (post)  ...  // run when post is removed
);

如果您想在帖子更改时在每个浏览器中执行某些操作,您可以在客户端上运行此代码。或者,如果您想说在添加重要帖子时向团队发送电子邮件,您可以在服务器上运行它。

请注意,addedremoved 指的是查询,而不是文档。如果您有一个现有的 post 文档并运行

Posts.update(my_post_id, $addToSet: tags: 'important');

这将触发“添加”回调,因为帖子正在添加到查询结果中。

【讨论】:

这是一个很好的答案,但不是这个问题。我问的是 Meteor 如何从 MongoDB 获取更改流,而不是如何从 Meteor 获取更改。【参考方案2】:

来自文档:

在服务器上,在后端 Mongo 服务器上创建具有该名称的集合。当您在服务器上调用该集合上的方法时, 它们直接转化为正常的 Mongo 操作。

在客户端上,创建了一个 Minimongo 实例。 Minimongo 本质上是一个内存中的、非持久的 Mongo 实现。 纯 javascript。它用作本地缓存,仅存储 此客户端正在使用的数据库的子集。查询 客户端(查找)直接从此缓存中提供服务,无需 与服务器对话。

当您在客户端写入数据库时​​(插入、更新、删除), 该命令立即在客户端上执行,并且, 同时,它被运送到服务器并在那里执行。 livedata 包对此负责。

这解释了客户端到服务器

我可以收集到的服务器到客户端是 livedata 和 mongo-livedata 包。

https://github.com/meteor/meteor/tree/master/packages/mongo-livedata

https://github.com/meteor/meteor/tree/master/packages/livedata

希望对您有所帮助。

【讨论】:

我没有测试过的一件事是,在 Meteor 外部完成的 MongoDB 集合中的插入是否会传播到客户端。 我浏览了代码,但看不到 MongoDB 通知 Meteor 集合更新的行。 @chrisdew 我刚刚将一条记录直接插入到 MongoDB 中,它出现在浏览器中。所以我猜服务器会收到通知。【参考方案3】:

目前,Meteor 确实适用于一个实例/进程。在这种情况下,所有查询都通过此实例,它可以将其广播回其他客户端。此外,它每 10 秒轮询一次 MongoDB,以查找由外部查询完成的数据库更改。它们是 1.0 的计划,以提高可扩展性,并希望允许多个实例通知每个实例有关更改。

另一方面,DerbyJS 使用的是 Redis PubSub。

【讨论】:

以上是关于Meteor 如何接收对 MongoDB 查询结果的更新?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:如何对 MySQL 字段关键字等结果中的记录进行排序 [重复]

MongoDB:如何对 MySQL 字段关键字等结果中的记录进行排序 [重复]

MongoDB & Meteor - 推入嵌套数组的查询不起作用,没有抛出错误

如何为 Meteor 构建 mongodb

在 Meteor 运行时,如何从另一个客户端访问 Meteor 的 MongoDB?

Meteor -- 如何连接到 mongodb? [复制]