我们假设您想要动态插入到不同的集合中。现在我正在使用switch语句:
switch (i) {
case "dog":
Dog.insert({
name: "Skippy"
});
break;
case "cat":
Cat.insert({
name: "Skippy"
});
break;
}

但这很麻烦,如果我需要支持未来的收藏,它就会失败。有没有办法选择基于" i"在上面的例子中?
答案 0 :(得分:2)
如果我错了,请纠正我,但我认为这就是你要做的事情:
var Dog = {
insert: function(props) {
console.log(props);
}
}
var insertArbitraryDocument = (function(collectionType, props) {
window[collectionType].insert(props)
}).bind(this);
insertArbitraryDocument('Dog', {name: 'skippy'}); //=> {name: 'skippy'}

在此片段中,您正在访问窗口对象并获取您传入的任何名称的属性(必须与集合完全相同)。然后你可以调用常用的函数调用。
答案 1 :(得分:0)
我认为没有一种流星内置方法可以做到这一点,但是手动创建一个集合目录非常容易:
JS与客户端和服务器的共同点:
var collections = {};
function myColl(name) {
var coll = new Meteor.Collection(name);
collections[name] = coll;
return coll;
}
// and now just use myColl instead of new Meteor.Collection
Dog = myColl('dog');
然后,做你想做的事:
collections[i].insert(data);
答案 2 :(得分:0)
这是一个完整的工作示例:
Posts = new Mongo.Collection('posts');
Comments = new Mongo.Collection('comments');
var capitalize = function(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
};
var nameToCollection = function(name) {
// pluralize and capitalize name, then find it on the global object
// 'post' -> global['Posts'] (server)
// 'post' -> window['Posts'] (client)
var root = Meteor.isClient ? window : global;
return root[capitalize(name) + 's'];
};
var insertSomething = function(name, data) {
var collection = nameToCollection(name);
collection.insert(data);
}
Meteor.startup(function() {
// ensure all old documents are removed
Posts.remove({});
Comments.remove({});
// insert some new documents
insertSomething('post', {message: 'this a post'});
insertSomething('comment', {message: 'this a comment'});
// check that it worked
console.log(Posts.findOne());
console.log(Comments.findOne());
});
请注意,这与this question几乎完全相同,但我简化了更通用的答案。