17

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

哪些 NoSQL 数据库(如果有)可以为查询结果集提供 *changes* 流?

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

谢谢,

克里斯。

4

3 回答 3

19

你想要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参考查询,而不是文档。如果您有一个现有的过帐文档并运行

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

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

于 2012-04-11T18:32:39.840 回答
3

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

另一方面,DerbyJS 正在使用 Redis PubSub。

于 2013-03-01T09:10:41.127 回答
2

从文档:

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

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

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

这解释了客户端到服务器

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

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

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

希望有帮助。

于 2012-04-16T15:21:43.320 回答