mongodb - MongoDB 使用同一对象数组的另一个字段的值更新数组对象
问题描述
我有一个如下集合:
{
_id: asilu92834,
services: [
{
chargeAmount: 10,
calculatedChargeAmount: 5,
},
{
chargeAmount: 20,
calculatedChargeAmount: 15,
}
]
}
我想要做的是用它的对象的计算的ChargeAmount 字段的值来更新chargeAmount 字段。更新后的文档应如下所示:
{
_id: asilu92834,
services: [
{
chargeAmount: 5,
calculatedChargeAmount: 5,
},
{
chargeAmount: 15,
calculatedChargeAmount: 15,
}
]
}
我知道如何在阅读每个文档后更新它,然后使用 forEach 一次更新一个。那不是我想要的。我知道 updateMany() 函数接受聚合管道,在这些管道中你应该能够做类似的事情
[
{ $set: { "value1": "$value2"}}
]
但是由于chargeAmount和计算的ChargeAmount嵌套在对象数组中,我试图这样做
db.collection.updateMany(filter, [
{
$set: {
'services.$[].chargeAmount': '$services.$[].calculatedChargeAmount'
}
}
]);
我收到错误消息说 FieldPath 字段名称可能不以“$”开头。不可能做我想要达到的目标吗?如果是这样怎么办?
解决方案
试试这个:
db.collection.updateMany({"services._id":req.user.id},
{$set: {"services.$.chargeAmount" :'services.$.calculatedChargeAmount'}},
function (error, success) {
if(error)
{
console.log(error);
}
else {
console.log('success');
}
})
请记住,这里的 id 是 mongoDB 中数组服务的 _id。它必须自动创建一个_id。
推荐阅读
- x86 - MSI-X 如何触发中断处理程序?是否需要轮询选择的内存地址?
- javascript - 如何返回一个总数的数组 - 减少函数 - Javascript
- python - 有没有办法轻松地将数据从 python/flask 应用程序传递到 node.js 应用程序?
- router - 允许来自网络的 ssh -“无法解析主机名”
- python - 有条件地将列表拆分为 2 个子列表,支持连续传递
- asp.net - 停止应用程序池时,哪些超时控制工作进程关闭
- visual-studio-code - vs 代码 - 无法格式化嵌入式语言
- c# - 获取 c# 的碰撞形状的高度(不是 gdscript)
- html - 是否可以为 html 页面内的链接创建条件逻辑
- ruby - Lambda ArgumentError:找不到登录名——扩展“~”