Итак, у меня есть messageThread со ссылкой на группу сообщений.
var messageThreadSchema = new Schema({
chatBetween: [{ type: Schema.Types.ObjectId, ref: 'User' }],
messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }],
lastMessage: {type: String}
})
Соответственно, у меня есть схема message
var messageSchema = new Schema({
sender: { type: Schema.Types.ObjectId, ref: 'User' },
reciever: { type: Schema.Types.ObjectId, ref: 'User' },
sentAt: { type: Date, default: Date.now },
text: String,
isRead: { type: Boolean, default: false }
})
У меня проблема с обновлением message.isRead через messageThread.
Мне нужно обновить свойство isRead всех сообщений внутри messageThread
Я пытался:
1.
MessageThread.findByIdAndUpdate(req.body._id, {
$set: {"messages.$.isRead": true} // I thought, maybe there is a typo and
"$set": {"messages.$.isRead": true} // tried too
"$set": {"messages.$.isRead": "true"} // tried too
})
.populate({ path: "messages" })
.exec((err, foundMessageThread) => {
});
2.
Как добавить обновление и удалить объект в Схема массива в Mongoose/MongoDB
MessageThread.update({'_id': req.body._id},
{'$set': {
"messages.$.isRead": true
}},
function(err,model) {
if(err){
console.log(err);
return res.send(err);
}
return res.json(model);
});
3.
Тогда я решил обновить isRead вручную. Я имею в виду:
MessageThread.findById(req.body._id)
.populate({ path: "messages" })
.exec((err, foundMessageThread) => {
var updatedMessage = foundMessageThread.messages.map(message=>{
return {...message, isRead:true}
})
var newThread = {...foundMessageThread,
messages: [...foundMessageThread.messages, ...updatedMessage]}
newThread.save()
});
Конечно, это не работает в Node. Поэтому мне пришлось все переделывать с помощью Object.assign(), что сделало мой код еще более запутанным.((
Мой вопрос:
- Почему мои 1 и 2 методы не работают?
- Есть ли способ проще?
messageThread._id
иmessage._id
функции, найтиmessageThread
, а затемfindByIdAndUpdate
message
? - person Chau Tran   schedule 03.01.2018message._id
и изменитьisRead
, но я думаю, что это отрицательно скажется на производительности. Потому что могут быть миллионы сообщений, не связанных с пользователем. Я прав? - person m_rd_n   schedule 03.01.2018messageThread
, вместо этого, заполняя его, я хочу, чтобыmessage
обновлял их. Как я могу обновить их, не просматривая миллионы сообщений? - person m_rd_n   schedule 03.01.2018messageSchema
, одинmessageThread
принадлежит только двум общающимся пользователям, не так ли? Вы только отflagRead
доmessage.receiver === currentUser.id && !message.isRead
, и вы можете выполнить проверку на стороне клиента с помощью другого сервиса, чтобы получитьcurrentUser
. Я не думаю, что это будет саботировать ваше выступление, в крайнем случае, не настолько, чтобы это заметили. СообщенияmessageThread
представляют собой массивmessageId
, поэтому вам НЕ НУЖНО делать здесь какие-либо изменения, если только вы не реализуете удаление сообщений. - person Chau Tran   schedule 03.01.2018Hooks
, которые вы можете использовать какpre
иpost
, поэтому вы можете иметьschema.pre('update', ...)
илиschema.post('update'...)
для изменения других вещей, связанных с соответствующим обновлением сообщения. - person Chau Tran   schedule 03.01.2018messageThread
принадлежит двумUsers
и имеет отношения «один-многие» сmessage
. И я согласен, мне не нужно изменятьmessageThread
. Что вы имеете в виду подflagRead
? - person m_rd_n   schedule 03.01.2018