【问题标题】:Unable to update multi level nested document using mongoose无法使用猫鼬更新多级嵌套文档
【发布时间】:2019-12-16 22:45:04
【问题描述】:

我需要更新用户文档地址数组中电话数组中特定号码的已验证字段。 当我想根据地址获取经过验证的电话号码数据时,我使用了聚合 https://mongoosejs.com/docs/api/aggregate.html#aggregate_Aggregate 函数。 现在,当我尝试更新时,我不确定如何完成。

我是 mongodb 和 mongoose 的新手。谁能建议我如何解决我的问题?

我的 mongo 架构如下:

User:{
    name:String,
    age:Number,
    address:[
        {
            address_line_one:String,
            city:String,
            phone:[
                {
                    number:String,
                    verified:Boolean
                }
            ]
        }
    ]
}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我们可以使用数组过滤器来更新多级数组。

    假设我们在 DB 中有以下数据:

    {
        "name" : "Marc",
        "age" : 17,
        "address" : [
            {
                "address_line_one" : "Its address line 1",
                "city" : "its city",
                "phone" : [
                    {
                        "number" : "111111111",
                        "verified" : false
                    },
                    {
                        "number" : "222222222",
                        "verified" : false
                    },
                    {
                        "number" : "333333333",
                        "verified" : false
                    }
                ]
            }
        ]
    }
    

    要更新电话号码“111111111”的验证状态,可以使用以下查询:

    db.collection.update(
        {},
        {
            $set:{
                "address.$[addressFilter].phone.$[phoneFilter].verified":true
            }
        },
        {
            "arrayFilters":[
                {
                    "addressFilter.phone.number":"111111111",
                },
                {
                    "phoneFilter.number":"111111111"
                }
            ],
            "multi":true
        }
    )
    

    输出:

    {
        "name" : "Marc",
        "age" : 17,
        "address" : [
            {
                "address_line_one" : "Its address line 1",
                "city" : "its city",
                "phone" : [
                    {
                        "number" : "111111111",
                        "verified" : true   // Updated
                    },
                    {
                        "number" : "222222222",
                        "verified" : false
                    },
                    {
                        "number" : "333333333",
                        "verified" : false
                    }
                ]
            }
        ]
    }
    

    这里我们使用了两个数组过滤器:'addressFilter'和'phoneFilter'

    • 地址过滤器过滤“地址”数组中电话号码“111111111”在电话数组的任何元素中的那些元素
    • 电话过滤器过滤那些具有电话号码的元素 “111111111”

    有关数组过滤器的更多信息,请参阅https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/

    【讨论】:

    • 非常感谢。这对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-11-09
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多