如何在mongoDB或Mongoose中更新嵌套数组的值

时间:2019-10-08 12:17:14

标签: node.js mongodb mongoose

我在mongoDB中有如下数据

_id : 5d91caf461f93f13e48ac307,
restaurants : [
    {
        name : 'grace restaurant',
        menus : [
            {
                menu_name : 'chicken soup',
                price : 100
            },
            {
                menu_name : 'Biriyani',
                price : 250
            },
        ]
    },
    {
        name : 'river side restaurant',
        menus : [
            {
                menu_name : 'veg lollipop',
                price : 47
            },
            {
                menu_name : 'Grill chicken',
                price : 210
            },
        ]
    }
]

现在,我需要将river side restaurant's菜单“ Grill chicken's”的价格更新为310。

我该如何使用mongoosemongoDB函数,我使用了很多不同的函数,但是没有用,请帮我找到它。

谢谢

1 个答案:

答案 0 :(得分:2)

我们必须使用数组过滤器。

以下是示例:

db.collection.update({},
{
    $set:{
        "restaurants.$[restaurantFilter].menus.$[menuFilter].price": 310
    }
},
{
    "arrayFilters":[
        {
            "restaurantFilter.name":"river side restaurant"
        },
        {
            "menuFilter.menu_name":"Grill chicken"
        }
    ]
})

更新前:

{
    "_id" : "5d91caf461f93f13e48ac307",
    "restaurants" : [
        {
            "name" : "grace restaurant",
            "menus" : [
                {
                    "menu_name" : "chicken soup",
                    "price" : 100
                },
                {
                    "menu_name" : "Biriyani",
                    "price" : 250
                }
            ]
        },
        {
            "name" : "river side restaurant",
            "menus" : [
                {
                    "menu_name" : "veg lollipop",
                    "price" : 47
                },
                {
                    "menu_name" : "Grill chicken",
                    "price" : 210
                }
            ]
        }
    ]
}

更新后:

{
    "_id" : "5d91caf461f93f13e48ac307",
    "restaurants" : [
        {
            "name" : "grace restaurant",
            "menus" : [
                {
                    "menu_name" : "chicken soup",
                    "price" : 100
                },
                {
                    "menu_name" : "Biriyani",
                    "price" : 250
                }
            ]
        },
        {
            "name" : "river side restaurant",
            "menus" : [
                {
                    "menu_name" : "veg lollipop",
                    "price" : 47
                },
                {
                    "menu_name" : "Grill chicken",
                    "price" : 310
                }
            ]
        }
    ]
}