mongoDB如何更新多数组数据

问题描述 投票:1回答:1

我有这个收藏集,名称为'product_number'

{
"_id" : ObjectId("5e2fd6f7413b5d25be4ac9b6"),
"product_id" : ObjectId("5e2fd4447ec0863eb053dc5d"),
"shipment" : "R",
"product_print_company" : ObjectId("5e12efdca7b696ea1d3c7f32"),
"reg_date" : "2020-01-28 06:38:47",
"product_nums" : [ 
    {
        "product_number" : "MultiProdNum1",
        "product_brand" : "digitech",
        "product_date" : "2020-01-27",
        "product_manufacturer" : "山田",
        "product_number_type" : "Q",
        "product_status" : "F",
        "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
        "product_eos_status" : "P",
        "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
    }, 
    {
        "product_number" : "MultiProdNum2",
        "product_brand" : "",
        "product_date" : "2020-01-27",
        "product_manufacturer" : "福田",
        "product_number_type" : "Q",
        "product_status" : "F",
        "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
        "product_eos_status" : "P",
        "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
    }
],
"mod_date" : "2020-01-28 07:52:09"
}

我进行了查询以更新product_status。

db.getCollection('product_number').update(
    {'$and': [
        {'_id': ObjectId('5e2fd6f7413b5d25be4ac9b6')}, 
        {'product_nums.product_number': {'$in': ['MultiProdNum1', 'MultiProdNum2']}}
    ]}, 
    {'$set': {'product_nums.$.product_status': 'S'}}
)

我的预期结果是两个数组的product_status被更改product_status ='S'

但是仅更改了product_number ='MultiProdNum1'数组。

我也尝试过。

db.getCollection('product_number').update(
    {'$and': [
        {'_id': ObjectId('5e2fd6f7413b5d25be4ac9b6')}, 
        {'product_nums.product_number': {'$in': ['MultiProdNum1', 'MultiProdNum2']}}
    ]}, 
    {'$set': {'product_nums.$[].product_status': 'S'}}
)

[]添加到{'$set': {'product_nums.$

当我尝试这样做时,即使我仅这样设置过滤器MultiProdNum1,所有数组数据也会更新。

db.getCollection('product_number').update(
    {'$and': [
        {'_id': ObjectId('5e2fd6f7413b5d25be4ac9b6')}, 
        {'product_nums.product_number': {'$in': ['MultiProdNum1']}}
    ]}, 
    {'$set': {'product_nums.$[].product_status': 'S'}}
)

我想要仅与product_number相匹配的多个更新数组数据。

谢谢。

mongodb mongodb-query
1个回答
0
投票

您可以尝试将.findOneAndUpdate()arrayFilters结合使用来实现这一目标:

查询:

db.getCollection('product_number').findOneAndUpdate(
    { "_id": ObjectId("5e2fd6f7413b5d25be4ac9b6"), 'product_nums.product_number': { '$in': ['MultiProdNum1'] } },
    {
        $set: {
            'product_nums.$[item].product_status': 'S',
        }
    },
    {
        arrayFilters: [{ 'item.product_number': { '$in': ['MultiProdNum1'] } }],
        returnNewDocument: true
    })

收集数据:

/* 1 */
{
    "_id" : ObjectId("5e2fd6f7413b5d25be4ac9b1"),
    "product_id" : ObjectId("5e2fd4447ec0863eb053dc5d"),
    "shipment" : "R",
    "product_print_company" : ObjectId("5e12efdca7b696ea1d3c7f31"),
    "reg_date" : "2020-01-28 06:38:47",
    "product_nums" : [ 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum2",
            "product_brand" : "",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "福田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech2222222222222",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }
    ],
    "mod_date" : "2020-01-28 07:52:09"
}

/* 2 */
{
    "_id" : ObjectId("5e2fd6f7413b5d25be4ac9b6"),
    "product_id" : ObjectId("5e2fd4447ec0863eb053dc5d"),
    "shipment" : "R",
    "product_print_company" : ObjectId("5e12efdca7b696ea1d3c7f32"),
    "reg_date" : "2020-01-28 06:38:47",
    "product_nums" : [ 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum2",
            "product_brand" : "",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "福田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech22222222222",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }
    ],
    "mod_date" : "2020-01-28 07:52:09"
}

结果:

/* 1 */
{
    "_id" : ObjectId("5e2fd6f7413b5d25be4ac9b1"),
    "product_id" : ObjectId("5e2fd4447ec0863eb053dc5d"),
    "shipment" : "R",
    "product_print_company" : ObjectId("5e12efdca7b696ea1d3c7f31"),
    "reg_date" : "2020-01-28 06:38:47",
    "product_nums" : [ 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum2",
            "product_brand" : "",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "福田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech2222222222222",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }
    ],
    "mod_date" : "2020-01-28 07:52:09"
}

/* 2 */
{
    "_id" : ObjectId("5e2fd6f7413b5d25be4ac9b6"),
    "product_id" : ObjectId("5e2fd4447ec0863eb053dc5d"),
    "shipment" : "R",
    "product_print_company" : ObjectId("5e12efdca7b696ea1d3c7f32"),
    "reg_date" : "2020-01-28 06:38:47",
    "product_nums" : [ 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "S",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum2",
            "product_brand" : "",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "福田",
            "product_number_type" : "Q",
            "product_status" : "F",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }, 
        {
            "product_number" : "MultiProdNum1",
            "product_brand" : "digitech22222222222",
            "product_date" : "2020-01-27",
            "product_manufacturer" : "山田",
            "product_number_type" : "Q",
            "product_status" : "S",
            "product_eos_hx" : "c0947adbae4e52bec538f41d9e57414aa878e134e3885cb0c717ee649789bbb5",
            "product_eos_status" : "P",
            "prodcut_qrcode" : "X903fMr6SINiOG87ADCos8qVUI8I3I3MqQz5n65aFFMH1WRf+vCZ3nZBEXjT0dtb"
        }
    ],
    "mod_date" : "2020-01-28 07:52:09"
}
© www.soinside.com 2019 - 2024. All rights reserved.