2013-03-05 112 views
3

是否可以即時創建新的流星集合?我想創建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

回答

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 
     } 
    } 
    }); 
} 

另外,還要確保你的名字是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

3

事情變得更加容易:在你的服務器的方法

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

運行此。