{
_id: messagePrefs_uniqueId,
type: 'prefs',
timestamp: unix_timestamp
ownerId: receipientId,
messageId: messageId,
read: true / false,
}
{
_id: message_uniqueId,
timestamp: unix_timestamp
type: 'message',
contents: 'this is the message',
senderId: senderId,
recipients: [receipientId1,receipientId2]
}
Скажем, у вас есть 3 сообщения, для которых вы хотите получить настройки, вы можете получить их через что-то вроде:
db.messages.find({
messageId : { $in : [messageId1,messageId2,messageId3]},
ownerId: receipientId,
type:'prefs'
})
Если вам нужно только чтение / непрочитанное, вы можете использовать это с возможностями upsert MongoDB, так что вы не создаете prefs для каждого сообщения, если пользователь фактически не читает его, тогда в основном вы создаете объект prefs с вашим собственным уникальным id и upsert это в MongoDB. Если вам нужна большая гибкость (например, теги или папки), вы, вероятно, захотите сделать преф для каждого получателя сообщения. Например, вы можете добавить:
tags: ['inbox','tech stuff']
к объекту prefs, а затем, чтобы получить все prefs всех сообщений, помеченных «техническими вещами», вы должны сделать что-то вроде:
db.messages.find({type: 'prefs', ownerId: recipientId, tags: 'tech stuff'})
Затем вы можете использовать messageIds, которые вы найдете в префе, для запроса и поиска всех сообщений, которые соответствуют:
db.messages.find((type:'message', _id: { $in : [array of messageIds from prefs]}})
Может быть немного сложно, если вы захотите сделать что-то вроде подсчета количества сообщений, которые каждый тег содержит эффективно. Если это всего лишь несколько тегов, вы можете просто добавить .count()
в конец вашего запроса для каждого запроса. Если это сотни или тысячи, то вы могли бы лучше использовать сценарий map / Reduce на стороне сервера или, возможно, объект, который отслеживает количество сообщений на тег для каждого пользователя.