即时创建新的Meteor集合

时间:2013-03-05 02:15:23

标签: mongodb meteor mongo-collection

是否有可能即时创建新的Meteor系列?我想根据一些路径名来创建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

2 个答案:

答案 0 :(得分:4)

我不完全确定这会奏效:

你需要它分两部分,第一部分加载你之前设置的集合(在客户端和服务器上)

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 } } }); } 对上面代码中的错误进行排序:

{{1}}

还要确保您的名字是javascript转义。

答案 1 :(得分:3)

事情变得容易多了:

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

在您的服务器方法中运行它。