mongodb - MongoDB 从 2 个子文档计算字段并生成新文档
问题描述
我有包含 2 个子文档fsgeneral
和balancesheet
. 为了计算不同的账面价值fye
,我将取值balancesheet.shareholderFund
/ fsgeneral.dilutedShares
。
问题是可以使用聚合来做到这一点,如何做到这一点?
我的输入集合如下:
{
"counter": "APPLE",
"fsgeneral": {
"0": {
"fye": "Mar-01",
"dilutedShares": {
"value": 10
}
},
"1": {
"fye": "Mar-02",
"dilutedShares": {
"value": 10
}
}
},
"balancesheet": {
"0": {
"fye": "Mar-01",
"shareholderFund": {
"value": 200
}
},
"1": {
"fye": "Mar-02",
"shareholderFund": {
"value": 400
}
}
}
预期结果:
{
"counter": "APPLE",
"output": {
"0": {
"fye": "Mar-01",
"bookvalue": {
"value": 20
}
},
"1": {
"fye": "Mar-02",
"bookvalue": {
"value": 40
}
}
}
}
我尝试了一些聚合,但未能了解如何同时使用 2 个子文档。
解决方案
你可以试试,
$objectToArray
将对象转换为数组并输入$map
, $map 将迭代循环,$reduce
迭代循环fsgeneral
并检查键匹配,balancesheet
然后使用除法$divide
$arrayToObject
,$map
将返回数组,这将再次转换为对象
db.collection.aggregate([
{
$project: {
counter: 1
output: {
$arrayToObject: {
$map: {
input: { $objectToArray: "$balancesheet" },
as: "a",
in: {
k: "$$a.k",
v: {
fye: "$$a.v.fye",
bookvalue: {
value: {
$reduce: {
input: { $objectToArray: "$fsgeneral" },
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this.k", "$$a.k"] },
{ $divide: ["$$a.v.shareholderFund.value", "$$this.v.dilutedShares.value"] },
"$$value"
]
}
}
}
}
}
}
}
}
}
}
}
])
推荐阅读
- javascript - Javascript不调用函数
- optimization - 优化 applescript 以减少能源影响
- android - 无法在 Android Studio 3.1.4 中放置智能横幅广告 & 应用程序崩溃。我应该使用哪些依赖项?
- java - 此方法调用为非空方法参数传递空值。要么将参数注释为应始终为非空的参数
- javascript - 与 vuex store + cookie 有关的问题
- r - Ggplot2:更改单个值的颜色
- neo4j - 使用 WHERE 排除节点不起作用
- scala - dataframe spark scala take the (MAX-MIN) for each group
- android - 我的应用程序不适用于 android < 5 中的自签名 SSL
- spring - Spring Boot 和 RabbitMQ 异常日志记录