Как обновить свойство объекта, который находится внутри массива, с помощью mongoose
Итак, у меня есть messageThread, который имеет ссылку на кучу сообщений
var messageThreadSchema = new Schema({
chatBetween: [{ type: Schema.Types.ObjectId, ref: 'User' }],
messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }],
lastMessage: {type: String}
})
Соответственно у меня есть схема сообщения
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.is для чтения через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.
Как добавить обновление и удалить объект в Array Schema в 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 методы не работают?
- Есть ли более простой способ?