【问题标题】:Find and Update multiple objects in Mongoose js在 Mongoose js 中查找和更新多个对象
【发布时间】:2026-01-01 10:55:02
【问题描述】:

问题: 我希望从我的数组模式中更新多个对象。 我试过的是,下面这个建议,我在这里找到的:Find and Update Object in Mongoose

是的,这可行,但是,这只会更新我的 messages_details 数组中包含所需对象的第一个元素。

await MessagesDetails
    .update(
        {
            _id : message_id,
            messages_details : {
                $elemMatch : {
                    user_id: user_id
                }
            }
        },
        {
            $set: {
                'messages_details.$.message_isRead': true,
            }
        }
    )

下面是我的架构:

const mongoose  = require('mongoose')
const Schema    = mongoose.Schema

const MessagesDetails = new Schema({
    _id : Schema.Types.ObjectId,
    messages_details_subject : {
        type : String,
        required : true
    },
    messages_details_sender : {
        type : Array,
        required : true
    },
    messages_details_recipient : {
        type : Array,
        required : true
    },
    messages_details_created : {
        type : Date,
        required : true
    },
    messages_details_updated : {
        type : Date,
        required : true
    },
    messages_details_isArchived : {
        type : Boolean,
        required : true
    },
    messages_details : [
        {
            user_id : Schema.Types.ObjectId,
            user_username : {
                type : String,
                required : true
            },
            message_content : {
                type : String
            },
            message_date : {
                type : Date
            },
            message_isArchived : {
                type : Boolean
            },
            message_isRead : {
                type : Boolean
            }
        }
    ]
})

module.exports = mongoose.model( 'messages_details', MessagesDetails )

所以我的最终目标是,根据下面的这些查询将 message_isRead 设置为 true;

_id 
messages_details.user_id 

有人可以告诉我吗?

【问题讨论】:

标签: javascript node.js mongodb mongoose


【解决方案1】:

您可以为此使用$[]-operator

await MessagesDetails
    .update(
        {
            _id : message_id,
            messages_details : {
                $elemMatch : {
                    user_id: user_id
                }
            }
        },
        {
            $set: {
                'messages_details.$[].message_isRead': true,
            }
        }
    )

【讨论】:

  • 感谢您的帮助。非常感谢。