2017-03-22 46 views
0

由於Meteor Docs有'服務器端','客戶端'和'本地'集合。有沒有辦法在正在運行的應用程序中更改「狀態」(例如,如果它是服務器端,客戶端或本地)?在運行Meteor App時將MongoDB Collection從本地更改爲服務器端

使用案例:用戶可以註冊和登錄的Web應用程序。他們可以存儲合理的數據。根據用戶的個人偏好,他應該能夠選擇數據是存儲在本地還是服務器上(一般決定 - 不是從個案到個案)。

當前的方法:它的工作很好,如果我要麼實例化集合本地CollectionName = new Mongo.Collection(null);或服務器端CollectionName = new Mongo.Collection('collectionName');。 但我想不出一種方法來讓用戶可以改變收藏狀態。

有沒有辦法做到這一點? 或者是需要的解決方法(例如,創建兩者,一個本地和服務器端的Collaction,並且只是決定插入/更新/查找哪一個 - 這意味着很多重複的代碼?!)。

編輯:要明確認爲:我希望用戶能夠選擇,如果他的數據存儲這是與服務器同步或集合,沒有任何一個同步收藏。

回答

1

不,您不能在運行的應用程序中更改集合的類型。

我想你對這些術語的含義感到困惑。 「客戶端」集合不會永久存儲在本地存儲中。這僅表示它是在瀏覽器的內存中的的集合。就像服務器端的服務器集合是服務器內存中的。區別不在於它如何定義,而在於代碼的運行位置。大多數集合都有一個客戶端和一個服務器端對應,並且它們通過pub/sub保持同步。服務器端集合也與MongoDB同步(使用oplog)。

本地收藏可以住在兩個地方,但「本地」意味着它們不與任何東西同步。

0

我可能不完全明白你想要做什麼,但本地集合不會持久化數據。

如果您傳遞null作爲名稱,那麼您正在創建一個本地集合。它在任何地方都不同步;它只是一個本地暫存器,支持Mongo風格的查找,插入,更新和刪除操作。 (在客戶端和服務器,這暫存器使用Minimongo實現的。)

這意味着添加到它們的客戶端上的任何數據都將被吹走,當用戶關閉瀏覽器(除非您還使用一個的local collection persist meteor packages),在流星應用重新啓動時,服務器上添加的任何數據都會被吹走。所以我不認爲你真的想使用本地收藏。

相反,我會用一個定期收集(其中一個名稱被傳遞到構造函數),要麼標準allowdeny選項(not really recommended了...但仍然是一個有效的方法),或流星方法(首選方法)控制誰可以更改數據以及允許更改哪些數據。

或者,另一個選項可能是將您的發佈功能傳遞給用戶希望在該給定會話的客戶端上看到的字段列表。爲此,您定義了一個新發布,該發佈收到一個displayFields參數,然後將其用作集合.find()中的字段說明符選項。

Meteor.publish("userData", function (userId, displayFields) { 
    // validate the structure and contents of displayFields 

    // retrieve the data but only use the fields that the user requested 
    return UserData.find({user_id: userId}, {fields: displayFields}); 
}); 

然後在客戶端,你會同意這個並通過在用戶希望看到的客戶端上的字段。

var displayFields = { 
    firstname: 1, 
    lastname: 0, 
    //... 
}; 

this.subscribe("userData", [displayFields]); 
+0

請注意'allow/deny'規則不被官方[流星指南](https://guide.meteor.com/security.html#allow-deny)推薦。 – aedm

+0

感謝您的關注!我個人從不使用'allow/deny'並總是使用Methods來實現收集數據的變化,但是並沒有意識到這是官方的指導。我會相應地更新我的答案以指出這一點。 – jordanwillis

+0

我想你其實並沒有完全理解我的問題。但是,你的答案幫助我,因爲[本地收集持續流星包](https://github.com/jeffmitchel/meteor-local-persist)可能會幫助我做我想做的事。我試圖寫下我的問題來澄清思想。 – zwif

相關問題