2016-04-26 84 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 } 
    } 
)