2016-04-26 115 views
0

我在設置適當的會話模式時遇到問題,該模式存儲對話和/或消息的讀/未讀標誌。我希望當前登錄的用戶能夠看到有多少會話中有新消息。目前,我的模式(使用imple-模式)看起來有點像這樣:流星/ MongoDB對話模式

Schema = {}; 

Schema.ConversationMessageRead = new SimpleSchema(
    { 
     "userId": { 
      type: String 
     }, 
     "createdAt": { 
      type: Date 
     } 
    } 
); 

Schema.ConversationMessage = new SimpleSchema(
    { 
     "userId": { 
      type: String 
     }, 
     "message": { 
      type: String, 
      optional: true 
     }, 
     "read": { 
      type: [Schema.ConversationMessageRead], 
      optional: true 
     }, 
     "createdAt": { 
      type: Date 
     } 
    } 
); 

Schema.Conversation = new SimpleSchema(
    { 
     "participants": { 
      type: [String], 
      optional: false 
     }, 
     "messages": { 
      type: [Schema.ConversationMessage], 
      optional: true 
     }, 
     "deleted": { 
      type: Boolean, 
      optional: false, 
      defaultValue: false 
     }, 
     "createdAt": { 
      type: Date 
     } 
    } 
); 

Conversations = new Mongo.Collection("conversations"); 
Conversations.attachSchema(Schema.Conversation); 

我這背後的想法是更新所有消息的子文檔read財產與當他們打開了一個對話的當前用戶ID。然後我很快發現你現在不能update multiple subdocuments

我願意改變對話系統的管理方式,如果有人有一個想法,以適當的方式來實現這一點。還有一件事要記住,我想保持它的反應,這意味着我不得不查詢這個集合,而不使用聚合函數。要做到這一點

回答

0

一種方法是有一個事件日誌收集:在此集合

Schema.EventLog = new SimpleSchema({ 
    userId: { type: String }, 
    conversationMessageId: { type: String }, 
    createdAt: { type: Date } 
}); 

文件將永遠不會被修改(插入,然後只讀),這是快。

雖然這的確最難解決的問題,如果你要設置的所有conversationMessages截至一次,然後讀取爲什麼不保存用戶閱讀會話中的最後日期時間,然後你可以看到,如果在會話的任何訊息比上次閱讀日期更新?完成相同目標的數據要少得多。

+0

其實,我最初是按照你在最後一段中提到的方式構建系統的。儘管我很難查詢數據。我可能會重新訪問它。 – SeanWM

0

如果我理解正確,這不是多次更新,而是每次用戶查看帖子時對子文檔數組的添加?我認爲這個命令會達到預期的效果:

Conversations.update(
    { _id: CONVERSATION_ID }, 
    { 
     $push: { 
      'messages.read': NEW_CONVERSATION_MESSAGE_READ_OBJECT } 
    } 
)