我的集合包含两个子文档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
}
}
}
}
我尝试了一些聚合,但未能了解如何同时使用两个子文档。
你可以试试,
$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"
]
}
}
}
}
}
}
}
}
}
}
}
])
游乐场