即时创建新的流星集合

问题描述:

是否可以即时创建新的流星集合?我想创建foo_barbar_bar,具体取决于某个应该是全局变量的路径名(我可以在整个应用程序中访问它)。
喜欢的东西:即时创建新的流星集合

var prefix = window.location.pathname.replace(/^\/([^\/]*).*$/, '$1'); 
var Bar = new Meteor.Collection(prefix+'_bar'); 

这里的事情是,我应该从URL让我prefix变量,因此,如果我宣布它的if (Meteor.isClient)外面我得到一个错误:ReferenceError: window is not defined。是否有可能做这样的事情呢?

编辑:使用Akshats的第一次迭代回答我的项目JS:http://pastie.org/6411287

+0

尽管可能,但这并不意味着这是一个好主意: MongoDB在集合数方面有一些限制,它并不意味着按集合进行扩展,所以如果你的动态集合变大了,你可能会撞墙。 – MrE 2016-05-11 22:22:28

我不能完全肯定这将工作:

你需要它,在两件,第一加载收藏你设置了前

var collections = {}; 
var mysettings = new Meteor.Collection('settings') //use your settings 

//Startup 
Collectionlist = mysettings.find({type:'collection'}); 

Collectionlist.forEach(function(doc) { 
    collections[doc.name] = new Meteor.Collection(doc.name); 
})' 

(客户端和服务器上),你需要一个位添加的服务器上的集合:

Meteor.methods({ 
    'create_server_col' : function(collectionname) { 
     mysettings.insert({type:'collection', name: collectionname}); 
     newcollections[collectionname] = new Collection(collectionname); 
     return true; 
    } 
}); 

而且你需要在客户端上创建它们:

//Create the collection: 

Meteor.call('create_server_col', 'My New Collection Name', function(err,result) { 
    if(result) { 
     alert("Collection made"); 
    } 
    else 
    { 
     console.log(err); 
    } 
} 

再次,这是所有未测试,所以我只是给它一个镜头希望它的作品。

编辑

也许下面应该工作,我已经添加了几个检查,看是否征收第一个存在。请你能不能运行meteor reset你用它来从错误上面的代码进行排序前:

var collections = {}; 
var mysettings = new Meteor.Collection('settings') 

if (Meteor.isClient) { 
    Meteor.startup(function() { 
    Collectionlist = mysettings.find({type:'collection'}); 

    Collectionlist.forEach(function(doc) { 
     eval("var "+doc.name+" = new Meteor.Collection("+doc.name+")); 
    }); 
    }); 
    Template.hello.greeting = function() { 
    return "Welcome to testColl."; 
    }; 

    var collectionname=prompt("Enter a collection name to create:","collection name") 

    create_collection(collectionname); 

    function create_collection(name) { 
    Meteor.call('create_server_col', 'tempcoll', function(err,result) { 
     if(!err) { 
      if(result) { 
       //make sure name is safe 
       eval("var "+name+" = new Meteor.Collection('"+name+"')); 
       alert("Collection made"); 
       console.log(result); 
       console.log(collections); 
      } else { 
       alert("This collection already exists"); 
      } 
     } 
     else 
     { 
      alert("Error see console"); 
      console.log(err); 
     } 
    }); 
    } 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    // code to run on server at startup 
    Collectionlist = mysettings.find({type:'collection'}); 

    Collectionlist.forEach(function(doc) { 
     collections[doc.name] = new Meteor.Collection(doc.name); 
    }); 
    }); 

    Meteor.methods({ 
    'create_server_col' : function(collectionname) { 
     if(!mysettings.findOne({type:'collection', name: collectionname})) { 
     mysettings.insert({type:'collection', name: collectionname}); 

     collections[collectionname] = new Meteor.Collection(collectionname); 

     return true; 
     } 
     else 
     { 
     return false; //Collection already exists 
     } 
    } 
    }); 
} 

另外,还要确保你的名字是JavaScript的转义。

+0

感谢您的帮助:)我一直在玩你的代码,我注意到一些东西。首先,我不得不改变一些拼写错误,我的新代码是[here](http://pastie.org/6411287)。运行后,我可以看到警报,所以显然创建了集合,但是当我尝试查询我的新集合时,我得到'ReferenceError:tempcoll未定义。在警告出现后,如果我尝试在控制台中看到我的“集合”对象,我发现它是空的。 – errata 2013-03-07 13:07:44

+0

最后,如果我在代码中使用相同的集合名称刷新页面,我会在调用方法'create_server_col'时得到'异常'错误:名为'/ tempcollx/insert'的方法已经被定义。所以我想我应该检查一下同名的集合是否已经存在。我相信你真的很接近你的代码,也许有一些非常微不足道的东西,但是我对MongoDB没有太多的经验,所以我不确定如何进一步调试...感谢您再次帮助我:) – errata 2013-03-07 13:09:03

+0

如果您确定,我会回复您粘贴的代码,我可以编辑您的问题以包含您的要点链接吗? – Akshat 2013-03-08 13:55:56

事情变得更加容易:在你的服务器的方法

var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db; 
db.createCollection("COLLECTION_NAME", (err, res) => { 
    console.log(res); 
}); 

运行此。