Meteor.js:使用Collection来存储该集合的状态

时间:2015-05-09 00:21:28

标签: meteor

周五快乐!

我在这里对社区有一些新手问题,但是找不到以前的答案。我还没有足够的代码来创建一个包,但我想在我的集合中存储一些可以在任何地方重复使用的辅助方法,并且还可以重复使用" Words"集合命名空间我将客户端存储在我的lib文件夹中。当我这样做时,我对Mongo DB做了什么奇怪的事吗?根据我的理解,Words初始化Mongo集合,但实际变量只是一个常规JS变量,你可以添加方法和属性 - 事物的Mongo方面只能通过.find(),。insert()访问,等方法。这准确吗?而且一般来说,这是一个很好的做法吗?

Words = new Mongo.Collection ('words');
Words.state = {};

Words.state.shuffle = function ( ) {
    return _.shuffle( Words.find().fetch() );
};
//find id of current set

Words.state.indexOf = function ( id ) {
    var i;
    var arr = Words.state.currentSet;
    for ( i = 0; i < arr.length ; i++ ) {
        if (arr[i]._id === id ) return i;
    }
}; 

2 个答案:

答案 0 :(得分:3)

当我这样做时,我是否对Mongo DB做了一些奇怪的事情?

没有。 Meteor通过低级mongodb驱动程序与mongo通信,该驱动程序仅从所有collections固有的功能中调用:findinsertremove,{{1}因此,只要您不替换任何上述功能,您就可以自由地修改集合实例。

一般来说这是一个好习惯吗?

这是一个意见问题,但我想是的。我喜欢为集合实例和转换后的文档添加函数。例如:

update

现在,只需在您的应用中,您就可以致电Posts = new Mongo.Collection('posts'); Posts.fetchByAuthor = function(userId) { if (userId == null) userId = Meteor.userId(); return Posts.find({authorId: userId}).fetch(); }; 获取作者的帖子列表,而无需知道收集数据是如何存储在幕后的。

如果您需要文档实例上的额外功能(而不是整个集合),我建议您使用collection helpers。例如:

Posts.fetchByAuthor()

现在,我们可以在应用中的任意位置拨打Posts.helpers({ author: function() { return Meteor.users.findOne(this.authorId); } }); ,以获取特定帖子的作者。同样,我们可以调用该函数,而无需知道作者如何存储在文档中的细节。

尽管这些示例很简单,但集中模型层逻辑的技术非常强大,因为它有助于区分应用的问题。在较大的项目中,我们发现这极大地简化了我们的工作,特别是在编写模板代码时。

推荐阅读:How to add a model layer to your app

答案 1 :(得分:0)

Meteor社区包是学习如何扩展Mongo Collections的最佳资源。我最喜欢的一个是collection-hooks,但还有其他类似的aldeed:collection2强制您的插入和更新操作符合程序包aldeed:simple-schema提供的架构。

你也应该谷歌扩展Javascript中的对象,你会理解包的代码。检查jQuery和/或Underscore.js方法,你会找到相关的方法,让你在这件事上更轻松。