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



周五快乐!

我在这里对社区有一个有点新手的问题,找不到以前的答案。我不一定有足够的代码来创建包,但我想在我的集合上存储一些可以在任何地方重用的帮助程序方法,也可以重用"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;
}
}; 

当我这样做时,我对Mongo DB做了什么奇怪的事情吗?

不。Meteor 通过低级 mongodb 驱动程序与 mongo 通信,该驱动程序仅从所有集合固有的函数调用:findinsertremoveupdate等。因此,只要不替换上述任何函数,就可以自由修改集合实例而不必担心。

一般来说,这是一种好的做法吗?

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

Posts = new Mongo.Collection('posts');
Posts.fetchByAuthor = function(userId) {
if (userId == null)
userId = Meteor.userId();
return Posts.find({authorId: userId}).fetch();
};

现在,在应用中的任何位置,您都可以调用Posts.fetchByAuthor()来获取作者的帖子列表,而无需知道收集数据是如何存储在后台的。

如果您需要在文档实例(而不是整个集合)上使用额外的函数,我建议使用集合帮助程序。例如:

Posts.helpers({
author: function() {
return Meteor.users.findOne(this.authorId);
}
});

现在,我们可以在应用程序中的任何位置调用post.author()以获取特定帖子的作者。同样,我们可以调用该函数,而无需知道作者如何在文档中存储的详细信息。

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

推荐阅读: 如何将模型层添加到应用程序

Meteor 社区包是学习如何扩展 Mongo 集合的最佳资源。我最喜欢的一个是collection-hooks,但还有其他像aldeed:collection2这样的,它强制你的插入和更新操作符合包aldeed:simple-schema提供的模式。

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

最新更新