【问题标题】:Update multiple documents by array of objects field value in mongoose通过猫鼬中的对象字段值数组更新多个文档
【发布时间】:2017-05-26 16:50:21
【问题描述】:

这是我的架构。

 Home = new Schema({
        name: { type: String, required: true},
        description: {type: String},
        administrator: {type : mongoose.Schema.Types.ObjectId, ref: 'User', required: true},

    users: [{ 
        _id: {type : mongoose.Schema.Types.ObjectId, ref: 'User'},
        email: {type: String},
        name: { type: String},
        status: { type: Number}
    }],
    rooms: [Room]


});
module.exports = mongoose.model('Home', Home);

如果我想跨多个文档查找特定用户,我可以这样做

Home.find({"users.email": "johnk@gmail.com"},{users:1})

这将返回所有带有 users.email = johnk@gmail.com 的家庭

但是用户的字段是一个数组。

"users" : [
        {
            "status" : 0,
            "name" : "Yaknow",
            "email" : "yaknow@gmai.com",
            "_id" : ObjectId("5875a42ea469f40c684de385")
        },
        {
            "status" : 1,
            "name" : "johnk",
            "email" : "johnk@gmail.com",
            "_id" : ObjectId("586e31c6ce07af6f891f80fd")
        }
    ]

(这只是一个家,家多的话会有很多这样的数组) 因此,上面的查询将返回用户收到电子邮件的每个家庭的每个用户数组。 我的问题是,如何将 JohnK 的所有实例更新为 JohnKirtster? 使用它会将数组名称中的每个用户更新为 JohnKirster

Home.update(query, {users.name: "JohnKirster"})

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    你可以通过设置multi:true来使用mongodb $ positional operator

    Home.update(
     {"users.name": "johnk"}, //query, you can also query for email
     {$set: {"users.$.name": "JohnKirster"}},
     {"multi": true} //for multiple documents
    )
    

    【讨论】:

    • 这可以解决问题。以前没有使用过位置运算符。虽然是一个小类型,{“multi”:true},但是是的,这解决了它。
    • 如何批量更新字段? ex - users.email、users.address、users.first 等。在这种情况下,我有一个 users 对象。我不想提及每个领域。我想要类似 {$set: {"users.$.": users}}
    • @VikasChauhan,您可以使用{$set: {"users.$": user}} 来实现。即user 是整个用户对象
    • @JyothiBabuAraja 谢谢,我也试过了,但没有用。我找到了一种方法。
    猜你喜欢
    • 2022-08-18
    • 2019-09-14
    • 2013-12-04
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2021-10-17
    • 2020-07-31
    • 2017-04-18
    相关资源
    最近更新 更多