无法使用猫鼬更新多层嵌套文档

时间:2019-08-09 08:03:15

标签: node.js mongodb mongoose

我需要更新用户文档地址数组内电话数组中特定号码的已验证字段。 当我想基于地址获取经过验证的电话号码数据时,我使用了聚合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
                }
            ]
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

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

比方说,我们在数据库中有以下数据:

{
    "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/