2012-11-29 44 views
1

在Meteor中,我發佈了一個來自非Mongo源的集合(特別是IMAP)。在Meteor中,如何從非Mongo Collection中刪除項目?

Meteor.publish("search_results", function(user, password, str) { 
    var self = this; 
    res_msg = []; 

    Imap.connect({... }); 

    Imap.search(str, resultcb); 
    for (var i = 0; i < res_msg.length; i++) { 
    self.set("s_results", Meteor.uuid(), {uid: res_msg[i].uid, date: res_msg[i].date, headers:res_msg[i].headers}); 
    } 

    self.flush(); 
    self.complete(); 
    self.flush(); 
    console.log("total messages : ", res_msg.length); 
}); 

這工作正常。但是,在第二次通過時,新項目被追加到集合中。似乎沒有辦法從非Mongo集合中刪除記錄。

從文檔看來,如果使用this.unset,它會改變屬性,而不是刪除記錄。

我無法在客戶端或服務器端使用collection.remove({})。

+0

什麼是'Imap'? –

+0

Imap是我寫的一個流星包,它封裝了[node.js IMAP包](https://github.com/mscdex/node-imap)並將其放入光纖中,以便與Meteor配合使用。 –

回答

1

我發現了一個非常難看的方式來做到這一點,所以我將問題留在希望有更好的選擇的問題上。

基本上,如果您取消設置所有屬性,文檔將消失。問題是如何遍歷publish方法中的集合來查找所有文檔,以便可以取消設置屬性。創建一個集合似乎並不奏效,更別提.find();

我將id列表存儲在單獨的數組中。醜,我知道。我希望你能做得更好。

for (i = 0; i < uuids.length; i++) { 
    self.unset("s_results", uuids[i], {}); 
} 
uuids = []; 
Imap.search(str, resultcb); 
for (var i = 0; i < res_msg.length; i++) { 
    var u = Meteor.uuid(); 
    self.set("s_results", u, {uid: res_msg[i].uid, date: res_msg[i].date, headers:res_msg[i].headers}); 
    uuids.push(u); 
} 
+1

我不認爲你離得太遠了。要發佈非實時數據源,您需要某種緩存,以便計算連續查詢之間的差異。 您的'uuids'數組與Mongo驅動程序和合並框中保存的內部狀態非常相似。 – debergalis