2013-11-26 49 views
4

有什麼辦法從服務器端JavaScript代碼中使用Meteor刪除Mongo數據庫收集? (真的降了整個事情,而不僅僅是Meteor.Collection.remove({});它的內容)丟棄流星中的Mongo數據庫收集

另外,有沒有還到服務器端內掉落Meteor.Collection的方式JavaScript代碼不刪除相應的數據庫收集?

爲什麼這樣做?

  • 在子文檔(用戶文檔的子文檔,例如userdoc.mailbox[12345])用下劃線或相似搜索原來安靜慢(例如,對於大郵箱)。
  • 另一方面,將所有用戶的所有郵件(以郵箱爲例)放在一個大型數據庫中,然後搜索*所有郵件中的一個或多個特定郵件,結果非常非常慢(對於很多擁有大型郵箱的用戶)。
  • 對於Mongo文檔也有大小限制,所以如果我將用戶的所有郵件存儲在他/她的用戶文檔中,則郵箱的最大大小爲< 16 MB以及所有其他用戶數據。

所以我想爲我的每一個用戶使用它作爲一個郵箱數據庫,那麼對於一個消息的最大大小爲16 MB(非常可以接受的),我可以使用蒙戈查詢搜索的郵箱。另外,由於我使用的是Meteor,因此只要用戶登錄,就可以將這個mongo數據庫集合加載爲Meteor.Collection,這很好。當用戶停用他/她的帳戶時,db應該當然被丟棄,如果用戶剛剛註銷,只有Meteor.Collection應該被丟棄(並且在他/她再次登錄時恢復)。

在某種程度上,我已經得到了這個工作,每個用戶都有自己的郵箱分貝,但是如果有人取消他/她的帳戶,我必須手動刪除這個特定的Mongo Collection。另外,我一直保留所有mongo db集合作爲Meteor.Collections,因爲我無法刪除它們。

這是一個收集每用戶郵箱的良好工作的服務器端代碼片段:

var mailboxes = {}; 

Meteor.users.find({}, {fields: {_id: 1}}).forEach(function(user) { 
    mailboxes[user._id] = new Meteor.Collection("Mailbox_" + user._id); 
}); 

Meteor.publish("myMailbox", function(_query,_options) { 
    if (this.userId) { 
     return mailboxes[this.userId].find(_query, _options); 
    }; 
}); 

而客戶端只與這片客戶端代碼的某一查詢訂閱:

myMailbox = new Meteor.Collection("Mailbox_"+Meteor.userId()); 
Deps.autorun(function(){ 
    var filter=Session.get("mailboxFilter"); 
    if(_.isObject(filter) && filter.query && filter.options) 
     Meteor.subscribe("myMailbox",filter.query,filter.options); 
}); 

因此,如果客戶端操縱會話變量「mailboxFilter」,訂閱被更新並且用戶在minimongo中獲得新的一組消息。

它工作得很好,唯一缺少的是數據庫收集丟失。

感謝您的任何提示!

*我預先在這裏寫下了「滴」,這是一個徹頭徹尾的錯誤。我的意思是搜索。

回答

1

搜索的子文檔...

爲什麼要使用子文檔?每個用戶的文檔我想?

每個消息必須是它自己的文件

這是一個更好的方式,消息的集合,每個被id'ed給用戶。這樣,您可以過濾用戶在發佈訂閱時看到的內容。

丟棄在一個數據庫中的所有消息原來是爲衆多用戶提供大容量郵箱

這是因爲大多數的NoSQL數據塊(如果不是全部)都對讀密集型操作並沒有太大的減速很慢與寫密集。所以寫(更新,插入,刪除,)將需要更多的時間。

此外,一些在線服務(我認爲它是Twitter或雅虎)會在停用帳戶時告訴您:「您的數據將在未來N天內刪除。」或類似的東西。一個原因是您的數據需要時間來刪除。

用戶無論如何都要離開,因此您可以告訴用戶您的帳戶已停用,並且您的數據將在未來幾天內從我們的數據庫中刪除。爲了做到這一點,您可以立即響應用戶,通過發送空白回調來異步執行刪除操作。

+0

嘿約瑟夫!謝謝,但這就是我現在正在做的事情,但我需要爲用戶的收件箱爲每個用戶提供一個數據庫,以便通過使用mong db查詢來加快在收件箱中搜索一個或多個特定消息的過程。 Mongo無法在用戶文檔中使用message-subdocuments。我讀過mongo db實際上支持程序化丟棄數據庫,我只是不知道如何在流星中做到這一點。我的意思是..程序化的數據庫創建在Meteor中是沒有問題的。爲什麼要放棄一個? –

3

您可以直接從流星中完全刪除集合myMailboxmyMailbox._dropCollection()

我知道這個問題是舊的,但是當我搜索如何做到這一點

+1

這個方法實際上是首選的方法,因爲它會在未初始化的mongo集合''ns not found''上拋出一個錯誤,''rawColleciton() – Jankapunkt

6

不使用私有方法的解決方案是第一次打的是:

myMailbox.rawCollection().drop(); 

這在我看來更好,因爲流星可以在沒有任何警告的情況下隨機刪除或重命名私有方法。