2016-04-26 5 views
0

У меня возникли проблемы с настройкой правильной схемы разговора, в которой хранятся прочитанные/непрочитанные флаги разговоров и/или сообщений. Я хочу, чтобы текущий зарегистрированный пользователь мог видеть, сколько разговоров содержит в них новые сообщения. В настоящее время моя схема (с использованием реа-схема) выглядит немного как это:Схема разговора Meteor/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 } 
    } 
) 
Смежные вопросы