mongodb - MongoDB:如何根据文档字段计算更新文档字段?
问题描述
我想知道如何对文档字段执行计算,然后根据这些计算更新该文档中的现有字段?
我目前正在使用一种迂回的方式(如下),但我想知道是否有更高效或更直接的方式?
或者,如果可能,拥有一个动态的文档字段(“cumulativeField”),并以下列方式更新:
db.collection
.aggregate([
{ $match: { arrayField: { $exists: true } } },
{ $addFields: { cumulativeField: { $sum: "$arrayField.number" } } }
])
.forEach(function (x){
db.collection.updateOne(
{ id: x.id },
{ $set: { cumulativeField: NumberInt(x.cumulativeField) } }
)})
注意:arrayField = 一个“对象数组”字段,数组中的每个对象都有一个键“数字”,我将其值求和,然后将其作为单个值放入“cumulativeField”字段中。
解决方案
MongoDB >= 4.2 支持管道更新,更新可以像聚合一样,聚合结果是文档的新值。
在您的情况下,我认为您只需将代码编写为
updateOne({},
[{ $match: { arrayField: { $exists: true } } },
{ $addFields: { cumulativeField: { $toInt: { $sum: "$arrayField.number" } } } }])
推荐阅读
- django - django,无法使用 filefield 将文件上传到目录,
- next.js - next.js:如何定义带有服务器端渲染内容的 sitemap.xml 路由?
- python - AppEngine 标准 + 云任务 - 最大并发请求
- c# - 使用 AWS SES 时的 C# SmtpClient 连接池问题
- php - 传单嵌入视频未显示
- amazon-web-services - 使用 AWS lambda 从 API 读取 Json 响应
- android - 未来
无法分配给列表类型“小部件” - ios - 为什么我的 rx tableview 没有立即响应?
- spring-boot - @SpringBootTest 尝试连接到实际的 Ehcache 实例
- python - 从已编译的正则表达式对象中获取组子模式