Meteor.Collection和Meteor.Collection.Cursor

时间:2014-02-22 10:19:12

标签: mongodb meteor

什么是

Meteor.Collection 

Meteor.Collection.Cursor

这两者如何相互关联?做了:

new Meteor.Collection("name") 

使用参数名称?

创建MONGODB集合

2 个答案:

答案 0 :(得分:10)

  

新的Meteor.Collection(“name”)是否创建了带参数名称的MONGODB集合?

不完全是。 Meteor.Collection 表示可能存在或可能不存在的MongoDB集合,但在插入文档之前,实际上并未创建实际的MongoDB集合。

Meteor.Collection.Cursor是一个反应式数据源,表示MongoDB集合中存在的更改子集。此文档子集由您传递给selector方法的optionsMeteor.Collection.find(selector, options)参数指定。此find()方法返回游标对象。我认为Meteor Docs很好地解释了游标:

  

find返回一个游标。它不会立即访问数据库或返回文档。游标提供fetch以返回所有匹配的文档,map和forEach迭代所有匹配的文档,并观察和观察更改以在匹配文档集更改时注册回调。

     

集合游标不是查询快照。如果数据库在调用Collection.find和获取游标结果之间或从游标中获取结果时发生更改,则这些更改可能会也可能不会出现在结果集中。

     

游标是一个反应数据源。第一次在反应计算(例如,模板或自动运行)中使用fetch,map或forEach检索游标文档时,Meteor将注册对基础数据的依赖。对更改游标中文档的集合的任何更改都将触发重新计算。要禁用此行为,请将{reactive:false}作为选项进行查找。

游标的反应性很重要。如果我有一个游标对象,我可以通过调用它上面的fetch()来检索它所代表的当前文档集。如果数据在调用之间发生变化,fetch()方法实际上将返回不同的文档数组。 Meteor中的许多东西本身都能理解游标的反应性。这就是我们可以从模板助手函数返回游标对象的原因:

Template.foo.documents = function() {
  return MyCollection.find(); // returns a cursor object, rather than an array of documents
};

在幕后,Meteor的模板系统知道在这个光标对象上调用fetch()。当服务器发送客户端更新告知集合已更改时,将通知游标此更改,这会导致重新计算模板帮助程序,从而导致模板被重新呈现。

答案 1 :(得分:3)

Meteor.Collection是您要定义的对象:

var collection = new Meteor.Collection("collection");

然后,此对象允许您将数据存储在mongo数据库中。请注意,只需以这种方式定义集合在您的mongo数据库中创建集合。在将文档插入后,将创建集合。

因此,在您向其插入文档之前,会有一个名为name的集合。

游标.find()操作的结果:

var cursor = collection.find()

您可能有1000个文档,光标可让您逐个浏览,而无需将所有文档加载到服务器的RAM中。

然后,您可以使用forEach进行循环,或使用文档中指定的其他一些操作:http://docs.meteor.com/#meteor_collection_cursor

Cursor也是客户端上的响应数据源,因此如果数据发生更改,您可以使用相同的查询来更新DOM。

正如Neil所提到的那样,知道Mongo是一个NoSQL数据库也是值得的。这意味着您不必真正创建表/集合。您只需定义上面的收集,然后将文档插入其中。这样,如果集合不存在,则会创建集合。如果它已经存在,它将被插入到该集合中。

浏览本地数据库

在发布应用程序之前,您不需要关心MongoDB,只需使用Meteor就可以与它进行交互。如果你想看看它的样子:

如果您想查看Mongo数据库。 当meteor正在运行时,在同一目录中使用meteor mongo来启动mongo shell,或者使用robomongo(Gui工具)之类的工具连接到端口3002上的localhost看看你的mongo数据库是什么样的。