2016-07-26 39 views
1

我有一個會議的文件是這樣的:流星蒙戈:橫跨收藏同步領域

{ 
    "name":"Meeting Name", 
    "uuid":"NYoc2aL6", 
    "participants":[ 
     { 
      "id":"JLKGZnfFkGvX9DHgz", 
      "status":"joined", 
      "name":"Guest 03" 
     }, 
     { 
      // newly invited user, user hasn't logged in with invite url yet 
      "id":"", 
      "status":"invited", 
      "name":"[email protected]" 
     } 
    ] 
} 

,我需要在「名稱」字段中收集的用戶名同步。有沒有一種自動的方式來做到這一點,比如在數據庫級別,還是我堅持手動更新每個名稱更改的地方?

回答

1

這是流星一個很常見的模式。您可以使用matb33:collection-hooks軟件包來「掛鉤」集合更新以同步共享值。這當然應該在服務器端完成,所以您不必擔心一些相關文檔不能提供給您。

實施例:

Meteor.users.after.update((userId, doc, fieldNames, modifier, options)=>{ 
    if (fieldNames.indexOf('profile.name') > -1){ // the name was changed 
    Meetings.update({ 'participants.id': doc._id }, 
     { $set: { 'participants.name': doc.profile.name }}, 
     { multi: true }); 
    } 
}); 
1

沒有「自動」的方式來做到這一點,我知道在Mongo或流星。但是,爲什麼不把公共領域從你的文檔中拿出來並且鏈接到ID?這就是所謂的「數據庫標準化」,這是一個從表中刪除多餘數據(Mongo中的集合)以防止這些問題的過程。

+0

數據庫標準化增加獲取時間結束。如果你真的必須一次又一次查找所有的用戶名,那麼把名字存入文檔會更好。所以這取決於。他將節省檢索數據的空間或時間: – Dude

+0

這是您必須深入瞭解應用程序的工作方式的地方。添加到文檔將減少加載時間並增加節省時間和空間(對於重複的字段),以及增加代碼複雜性和保持事物同步的潛在問題。通過共享ID進行鏈接將消除同步代碼的複雜性並減少空間,同時它還增加了更多收藏並降低了閱讀速度。它也可以增加插入/更新,取決於這些流量的方式。知道什麼是更重要的應用程序在這些情況下有幫助。 – CodeChimp

+0

在我的情況下,更具體的原因是與可選的用戶體驗序列有關,即在某些情況下,用戶將被添加到會議中,但尚未擁有實際的用戶帳戶,因此沒有'user.profile.name'領域。通常情況下,我會盡量規範一切。 – T3db0t

1

這可以通過觀察用戶數據庫的變化「自動」完成:

var usersCursor = Meteor.users.find(); 
usersCursor.observeChanges({"changed":function(id, fields){ 
    if(fields.profile.name){ 
     ... do whatever needs to be done ... 
    } 
}});