3

所以,我有一个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 }
})

我在通过messageThread更新message.isRead时遇到问题。我需要更新messageThread中所有消息的isRead属性


我试过了:

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 的 Array Schema 中添加更新和删除对象

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.js 中不起作用。所以我不得不使用 Object.assign() 重做所有事情,这使我的代码更加混乱。((

我的问题:

  1. 为什么我的 1 和 2 方法不起作用?
  2. 有没有更简单的方法?
4

0 回答 0