即时创建新的流星集合
是否可以即时创建新的流星集合?我想创建foo_bar
或bar_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
我不能完全肯定这将工作:
你需要它,在两件,第一加载收藏你设置了前
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的转义。
感谢您的帮助:)我一直在玩你的代码,我注意到一些东西。首先,我不得不改变一些拼写错误,我的新代码是[here](http://pastie.org/6411287)。运行后,我可以看到警报,所以显然创建了集合,但是当我尝试查询我的新集合时,我得到'ReferenceError:tempcoll未定义。在警告出现后,如果我尝试在控制台中看到我的“集合”对象,我发现它是空的。 – errata 2013-03-07 13:07:44
最后,如果我在代码中使用相同的集合名称刷新页面,我会在调用方法'create_server_col'时得到'异常'错误:名为'/ tempcollx/insert'的方法已经被定义。所以我想我应该检查一下同名的集合是否已经存在。我相信你真的很接近你的代码,也许有一些非常微不足道的东西,但是我对MongoDB没有太多的经验,所以我不确定如何进一步调试...感谢您再次帮助我:) – errata 2013-03-07 13:09:03
如果您确定,我会回复您粘贴的代码,我可以编辑您的问题以包含您的要点链接吗? – Akshat 2013-03-08 13:55:56
事情变得更加容易:在你的服务器的方法
var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
db.createCollection("COLLECTION_NAME", (err, res) => {
console.log(res);
});
运行此。
尽管可能,但这并不意味着这是一个好主意: MongoDB在集合数方面有一些限制,它并不意味着按集合进行扩展,所以如果你的动态集合变大了,你可能会撞墙。 – MrE 2016-05-11 22:22:28