MongoDB从2个子文档中计算字段并生成新文档



我的集合包含两个子文档fsgeneralbalancesheet。为了计算不同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
}
}
}  
}

我尝试了一些聚合,但未能了解如何同时使用两个子文档。

你可以试试,

  • $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"
]
}
}
}
}
}
}
}
}
}
}
}
])

游乐场

最新更新