Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何使用mongoose更新数组中对象的属性_Arrays_Node.js_Angular_Mongoose_Positional Operator - Fatal编程技术网

Arrays 如何使用mongoose更新数组中对象的属性

Arrays 如何使用mongoose更新数组中对象的属性,arrays,node.js,angular,mongoose,positional-operator,Arrays,Node.js,Angular,Mongoose,Positional Operator,因此,我有一个消息线程,它引用了一堆消息 var messageThreadSchema = new Schema({ chatBetween: [{ type: Schema.Types.ObjectId, ref: 'User' }], messages: [{ type: Schema.Types.ObjectId, ref: 'Message' }], lastMessage: {type: String} }) 因此,我有一个消息模式 var messageS

因此,我有一个消息线程,它引用了一堆消息

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 }
})
我在通过消息线程更新消息时遇到问题。isRead

我需要更新messageThread中所有消息的isRead属性


我试过:

一,

二,

三,

然后我决定手动更新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()
  });
当然,它在节点中不起作用。所以我不得不使用Object.assign()重做所有的事情,这使得我的代码更加混乱((

我的问题:

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

  • 能否将
    messageThread.\u id
    消息传递给函数,找到
    messageThread
    ,然后
    findbyiandupdate
    找到
    message
    ?您正在尝试更新与正在运行更新的集合不同的集合。Mongodb更新仅适用于单个集合中的数据。正确的方法是我们应该分别管理关系并保持它们的同步。这会为您清理问题。它是用于删除的,但概念类似。@ChauTran,你是对的,我可以搜索
    消息。\u id
    并更改
    isRead
    ,但我认为这会对性能产生负面影响。因为,可能会有数百万条消息这与用户无关。我说得对吗?@Veeram,我想我没法理解你。你能澄清一下吗?当谈到这个例子时,它解释得很好,但我找不到与我的案例的关系。我的意思是,在我的案例中,我不想更新
    messageThread
    ,而是通过填充它,我想得到
    message
    来更新它们。呵呵我可以在不搜索数百万条消息的情况下更新它们吗?正如您的
    messageSchema
    所示,一个
    messageThread
    只属于两个正在通信的用户,不是吗?您只能
    flagRead
    message.receiver==currentUser.id&&!message.isRead
    ,您可以在客户端使用另一个ser进行检查获取
    currentUser
    的副作用。我认为这不会破坏您的性能,最多也不足以引起注意。
    messageThread
    的消息是
    messageId
    的数组,因此除非您实现删除消息,否则您实际上不需要在此处进行任何修改。
    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);
    });
    
    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()
      });