周五快乐!
我在这里对社区有一些新手问题,但是找不到以前的答案。我还没有足够的代码来创建一个包,但我想在我的集合中存储一些可以在任何地方重复使用的辅助方法,并且还可以重复使用" 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;
}
};
答案 0 :(得分:3)
当我这样做时,我是否对Mongo DB做了一些奇怪的事情?
没有。 Meteor通过低级mongodb驱动程序与mongo通信,该驱动程序仅从所有collections固有的功能中调用:find
,insert
,remove
,{{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);
}
});
,以获取特定帖子的作者。同样,我们可以调用该函数,而无需知道作者如何存储在文档中的细节。
尽管这些示例很简单,但集中模型层逻辑的技术非常强大,因为它有助于区分应用的问题。在较大的项目中,我们发现这极大地简化了我们的工作,特别是在编写模板代码时。
答案 1 :(得分:0)
Meteor社区包是学习如何扩展Mongo Collections的最佳资源。我最喜欢的一个是collection-hooks,但还有其他类似的aldeed:collection2强制您的插入和更新操作符合程序包aldeed:simple-schema提供的架构。
你也应该谷歌扩展Javascript中的对象,你会理解包的代码。检查jQuery和/或Underscore.js方法,你会找到相关的方法,让你在这件事上更轻松。