首页 > 解决方案 > MongoDB 从 2 个子文档计算字段并生成新文档

问题描述

我有包含 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
      }
    }
  }  
 }

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

标签: mongodbmongooseaggregation-framework

解决方案


你可以试试,

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

操场


推荐阅读