Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MongoDB中获取百分比_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

如何在MongoDB中获取百分比

如何在MongoDB中获取百分比,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,集团阶段后的样本单据: [ { "_id": { workhour: 1 }, totalChats: 156 }, { "_id": { workhour: 0 }, totalChats: 36 } ] 你好!!如何找到这两个对象的百分比? 最终结果应该是: [ { "totalChats": 192, "workhour0": 19, "workhour1": 81

集团阶段后的样本单据:

[
  {
    "_id": {
      workhour: 1
    },
    totalChats: 156
  },
  {
    "_id": {
      workhour: 0
    },
    totalChats: 36
  }
]

你好!!如何找到这两个对象的百分比? 最终结果应该是:

[
  {
    "totalChats": 192,
    "workhour0": 19,
    "workhour1": 81
  }
]

谢谢大家!

要做到这一点,您至少需要有MongoDB版本
4.0
,因为要将
{workhour:1}
转换为
workhour1
格式,您需要使用字符串
1
1
转换为字符串,您需要使用
$toString
,该字符串仅在>=
4.0
中可用。您需要在
$group
阶段后添加这些阶段:

db.collection.aggregate([
    {
      $group: {
        _id: "", // Group without any condition will group all docs
        docs: { $push: { workhour: "$_id.workhour", totalChats: "$totalChats" } // push {workhour :...,totalChats:...} objects to data array
        },
        totalChats: { $sum: "$totalChats" } // Sum-up `totalChats` across all docs
      }
    },
    {
      $project: {
        _id: 0,
        totalChats: 1,
        data: {
          $arrayToObject: { // Converts [{k :..., v:...}, {k :..., v:...}] into {k : v, k:v }
            $map: { // Pushing objects {k:...,v:...} to an array
              input: "$docs",
              in: { k: { $concat: [ "workhour", { $toString: "$$this.workhour" } ] }, v: { $multiply: [ { $divide: [ "$$this.totalChats", "$totalChats" ] }, 100 ] } }
            }
          }
        }
      }
    },
    /** Replace root of doc with newly created object */
    {
      $replaceRoot: { newRoot: { $mergeObjects: [ "$data", { totalChats: "$totalChats" } ] } }
    }
  ])
测试:

Ref:


注意:您应该保持
18.75
原样,而不是将其转换为
19
81.25
81
以避免产生任何不确定性。

请不要发布代码图像(或错误)。相反,将代码作为代码格式的文本添加到问题本身。示例代码最好是最小可再现示例。另外,请告诉我们您到目前为止已经尝试了什么。@Jorge De La Vega Carrasco:您的MongoDB版本是什么?正如您所写的:)我的mongo高于4.0太棒了,您救了我的工作哈哈。非常感谢。