如何在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太棒了,您救了我的工作哈哈。非常感谢。