如何使用mongodb聚合在数组内部划分元素

时间:2019-08-12 10:17:30

标签: mongodb mongodb-query

我已经使用聚合来查找以下输出。
下一步是划分每个数组中存在的元素的值。

{
    "_id" : {
        “type”:”xxx”,
        "year" : 2019
    },
    "allvalues" : [
        {
            "label" : “used”,
            "value" : 50
        },
        {
            "label" : “total”,
            "value" : 58
        }
    ]
}
{
    "_id" : {
        “type”:”yyy”,
        "year" : 2019
    },
    "allvalues" : [
        {
            "label" : “used”,
            "value" : 63.214285714285715
        },
        {
            "label" : “total”,
            "value" : 59.535714285714285
        }
    ]
}

如何编写查询以在每个文档中划分使用/总计。
第一个文档是50/58,第二个文档是63.21 / 59.53。
json的结构保持不变。
输出应如下所示:

{
    “type”:”xxx”,
    "year" : 2019,
    “result” : 0.8
}
{
    “type”:”yyy”,
    "year" : 2019,
    “result” : 1.06
}

1 个答案:

答案 0 :(得分:1)

首先获得上述输入后,将其添加到聚合管道中,您需要使用$ filter和$ arrayElemAt来使用它,然后再加上total的值,因为除法未给出固定的小数位,我使用$ trunc进行值固定为小数点后2位

  {
    $project: {
      _id: 1,
      used: {
        $arrayElemAt: [
          {
            $filter: {
              input: "$allvalues",
              as: "item",
              cond: {
                $eq: [
                  "$$item.label",
                  "used"
                ]
              }
            }
          },
          0
        ]
      },
      total: {
        $arrayElemAt: [
          {
            $filter: {
              input: "$allvalues",
              as: "item",
              cond: {
                $eq: [
                  "$$item.label",
                  "total"
                ]
              }
            }
          },
          0
        ]
      },

    }
  },
  {
    $project: {
      _id: 1,
      result: {
        $divide: [
          {
            $trunc: {
              $multiply: [
                {
                  $divide: [
                    "$used.value",
                    "$total.value"
                  ]
                },
                100
              ]
            }
          },
          100
        ]
      }
    }
  }