mongodb - mongoDB如何更新多数组数据
问题描述
我有这个名为“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 的多重更新数组数据。
谢谢你。
解决方案
您可以尝试使用.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"
}
推荐阅读
- tin-can-api - 在 LMS 上使用 LRS 上的 oAuth 启动 xApi (TinCan) 包
- sql - 在 SQL 代理中安排 SP
- java - 无法检查扫描仪输入是否在数组列表中
- android - Kotlin - 忽略 id 的主键约束 - Android
- python - VS Code:使用调试时的 ModuleNotFoundError
- python - 生成随机坐标直到正确
- php - PHP 警告:PHP 启动:无法加载动态库“intl”未定义符号:__cxa_throw_bad_array_new_length
- c++ - C++ 模板元编程(版本小于 17,最好是 11)
- laravel-5 - 如何编写csv文件并在浏览器中下载?
- azure - 如何改进调试功能?