1

I have this collection named '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"
}

I made a query to update product_status.

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

My expected result is the two array's product_status are changed product_status = 'S'

But changed product_number = 'MultiProdNum1' array only.

I tried this also.

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

added [] to {'$set': {'product_nums.$

When i try that, All array datas are updated, evenif i set filter MultiProdNum1 only like this.

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

I want multi update array datas which matched product_number only.

Thank you.

whoami - fakeFaceTrueSoul
  • 17,086
  • 6
  • 32
  • 46
Gs.
  • 540
  • 1
  • 3
  • 21

1 Answers1

1

You can try using .findOneAndUpdate() with arrayFilters to achieve that :

Query :

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
    })

Collection Data :

/* 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"
}

Result :

/* 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"
}
whoami - fakeFaceTrueSoul
  • 17,086
  • 6
  • 32
  • 46
  • 1
    Work well. I think " , 'product_nums.product_number': { '$in': ['MultiProdNum1'] } "is no need. Point of solution is arrayFilters. Thank you so much. – Gs. Feb 03 '20 at 03:21