在Meteor中,如何根据变量选择集合?

时间:2015-07-24 20:37:33

标签: meteor

我们假设您想要动态插入到不同的集合中。现在我正在使用switch语句:



switch (i) {
  case "dog":
    Dog.insert({
      name: "Skippy"
    });
    break;
  case "cat":
    Cat.insert({
      name: "Skippy"
    });
    break;
}




但这很麻烦,如果我需要支持未来的收藏,它就会失败。有没有办法选择基于" i"在上面的例子中?

3 个答案:

答案 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几乎完全相同,但我简化了更通用的答案。