node.js - 使用 Nodejs 驱动程序更新 mongodb 中的数组对象
问题描述
这是我保存的文档
"_id": ObjectId("5e26be38c13b7149d0a95111"),
"isApproved": false,
"vendorOrder": [
{
"_id": ObjectId("5e26be38c13b7149d0a95113"),
"publicationCode": "TOI",
"publicationName": "Times of India",
"editionName": "chennai city",
"productCode": "TCE1",
"subscriptionCopies": 70,
"tradeCopies": 40
},
{
"_id": ObjectId("5e26be38c13b7149d0a95112"),
"publicationCode": "ET",
"publicationName": "Economic Times",
"editionName": "chennai city",
"productCode": "ECE1",
"subscriptionCopies": 20,
"tradeCopies": 100
}
],
"frequency": "TH",
"orderCreatedBy": ObjectId("5e25550a3405363bc4bf86c1"),
"submittedTo": ObjectId("5e2555363405363bc4bf86c2"),
这是我的 mongo shell 查询:
db.orders.updateOne(
{
"_id": ObjectId("5e26be38c13b7149d0a95111"),
"submittedTo":ObjectId("5e2555363405363bc4bf86c2"),
"vendorOrder.productCode": "TCE1"
},
{ $set:{"vendorOrder.$.tradeCopies":80 }
})
但是,只有一个元素正在更新,而且这在nodejsquery
中不起作用。
Nodejs查询:
const { orderId, dealerId, productCode, tradeCopies } = req.body;
try {
const orders = await Order.updateOne(
{
_id: orderId,
submittedTo: dealerId,
vendorOrder.productCode: productCode
}, {
$set: { vendorOrder.$.tradeCopies: tradeCopies }
}
)
} catch(ex) {
console.log(ex);
}
目标是一次性更新所有元素的vendorOrder:[{tradeCopies}]
唯一代码是产品代码,即我想更新,tradeCopies
将来自vendorOrder
哪里并且应该根据.productCode
orderId
dealerId
req.body
tradeCopies
productCodes
解决方案
要更新与数组元素字段(“productCode”)上的条件匹配的数组中的所有元素(“tradeCopies”字段),您必须使用$arrayFilters
更新选项。这可以在 Mongo Shell 以及 NodeJS 驱动程序的 API 方法调用中完成updateOne
。
Mongo Shell 版本:
db.collection.updateOne(
{ _id: ObjectId("5e26be38c13b7149d0a95111"), submittedTo:ObjectId("5e2555363405363bc4bf86c2") },
{ $set: { "vendorOrder.$[elem].tradeCopies" : 80 } },
{
arrayFilters: [ { "elem.productCode": "TCE1" } ]
}
)
NodeJS 版本:
col.updateOne( { _id: orderId, submittedTo: dealerId, },
{ $set: { "vendorOrder.$[elem].tradeCopies" : 80 } },
{ arrayFilters: [ { "elem.productCode": "TCE1" } ] },
function( err, result ) {
console.log(result);
}
);
[编辑-添加]
使用 async / await 语法,查询将是这样的(有关详细信息,请参阅MongoDB NodeJS 驱动程序更新示例):
result = await coll.updateOne( { ... }, { $set: { ... } }, { arrayFilters: [ { ...} ] } );
推荐阅读
- c# - 从泛型类调用委托方法
- python - 使用子进程在管道输出上调用 sed 的结果不一致
- python - Django:在模板中使用 for 迭代 2 个集合
- firebase - 是否可以在 Flutter Desktop 中使用任何类型的数据库
- quill - 创建公式印迹(分层标签)
- python - 数据集似乎暗淡 3,预期的估计量 <= 2
- sql - 在窗口函数中为表格起别名?
- google-cloud-platform - 物联网传感器设备 TI CC3200 在 Mongoose 操作系统上不可用的 COM 端口
- django - Django Rest 框架:带注释查询集的分页
- mysql - 在mysql中将日期转换为varchar会引发语法错误