Как обновить свойство объекта, который находится внутри массива, с помощью 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. Почему мои 1 и 2 методы не работают?
  2. Есть ли более простой способ?

0 ответов

Другие вопросы по тегам