mongodb - 如何在 MongoDB 中标记字段并根据日期求和
问题描述
需要格式化日期并每天计算总和,但有时a
或b
值不可用。最后,得到一份关于日期和总和的文件。我正在使用 MongoDB 4.2。
Data Structure:
{
"data": {
"11-10-2001": {
"a": 17.281150000000001,
"b": 11.864060000000006
},
"13-10-2020": {
"b": 2.7616699999999994
},
"12-10-2001": {
"b": 4.0809599999999997
},
"09-10-2001": {
"b": 4.1286300000000005
},
"17-10-2001": {
"a": 15.140560000000123,
"b": 5.017139999999998
},
"18-10-2001": {
"b": 1.975189999999997,
"a": 7.093789999999976
}
}
}
预期输出一个包含日期和总和的文档:
{
{
day: 11-10-2001,
sum : 29.145
},
{
day: 13-10-201,
sum : 2.7616699
},
{
day: 12-10-2001,
sum : 4.0809599999999997
},
{
day: 17-10-2001,
sum : 20.114
},
{
day: 18-10-2001,
sum : 9.145
}
}
解决方案
你可以试试,
$map
data
使用转换为数组后迭代对象循环$objectToArray
- 使用,转换为数组后,将 key
day
和sum
,添加$reduce
到 number 对象的循环中,以求和number 的值$objectToArray
$add
$unwind
解构数据数组$replaceRoot
将data
对象替换为根
db.collection.aggregate([
{
$addFields: {
data: {
$map: {
input: { $objectToArray: "$data" },
in: {
day: "$$this.k",
sum: {
$reduce: {
input: { $objectToArray: "$$this.v" },
initialValue: 0,
in: { $add: ["$$this.v", "$$value"] }
}
}
}
}
}
}
},
{ $unwind: "$data" },
{ $replaceRoot: { newRoot: "$data" } }
])
推荐阅读
- r - ggplot2,aes 与 aes_string
- c# - 在 ASP.NET Core Web API 3.1+ 中继承路由属性
- sql - 使用 postgresql 在短语后标记单词
- jquery - 如何修复此 JavaScript 以更改我网页上 div 标签的顺序?
- hadoop - HDFS中的重复目录
- python - RecursionError : 调用 Python 对象时超出最大递归深度
- runtime-error - 为什么即使我的代码在我的 python 空闲时运行良好,我也会在 HackerRank 中收到 EOF 错误?
- algorithm - 当值未知时查找多数元素
- r - 如何在 rshiny 中过滤列和拟合模型
- javascript - 如何在 Firefox 中基于视频约束进行 getusermedia 捕获?在 Chrome 中,一切都按照代码进行,但在 Firefox 中却不是?