gpt4 book ai didi

javascript - histogram 直方图的结果

转载 作者:行者123 更新时间:2023-11-30 19:25:10 27 4
gpt4 key购买 nike

我已经通过以下命令生成了直方图:

db.mydb.aggregate([{ $bucketAuto: { groupBy: "$userId", buckets: 1e9 } }])

假设我的唯一身份用户少于 10 亿(并且有足够的内存),这会为我提供每个用户的文档数。

User   Docs
===== ====
userA 3
userB 1
userC 5
userD 1

我想获取此直方图的结果并进行透视以计算每个文档计数的用户数。

结果如下:

Docs  Users
==== =====
1 2
2 0
3 1
4 0
5 1

在 MongoDB 中是否有一种简单、实用的方法可以做到这一点?

最佳答案

您可以从简单开始的一件事$group阶段:

db.col.aggregate([
{
$group: {
_id: "$docs",
count: { $sum: 1 }
}
},
{
$project: {
_id: 0,
docs: "$_id",
users: "$count"
}
},
{
$sort: { docs: 1 }
}
])

这会给你以下结果:

{ "docs" : 1, "users" : 2 }
{ "docs" : 3, "users" : 1 }
{ "docs" : 5, "users" : 1 }

那么没有用户的文档就是缺失的部分。您可以从您的应用程序或 MongoDB(如下所示)添加它们:

db.col.aggregate([
{
$group: {
_id: "$docs",
count: { $sum: 1 }
}
},
{
$group: {
_id: null,
histogram: { $push: "$$ROOT" }
}
},
{
$project: {
values: {
$map: {
input: { $range: [ { $min: "$histogram._id" }, { $add: [ { $max: "$histogram._id" }, 1 ] } ] },
in: {
docs: "$$this",
users: {
$let: {
vars: {
current: { $arrayElemAt: [ { $filter: { input: "$histogram", as: "h", cond: { $eq: [ "$$h._id", "$$this" ] } } }, 0 ] }
},
in: {
$ifNull: [ "$$current.count", 0 ]
}
}
}
}
}
}
}
},
{
$unwind: "$values"
},
{
$replaceRoot: {
newRoot: "$values"
}
}
])

这里的想法是,我们可以通过 null$group,这会生成包含前一阶段所有文档的单个文档。知道 $min$max 值,我们可以生成 $range数字和 $map该范围为现有计数或默认值 0。然后我们可以使用 $unwind$replaceRange获取每个文档的单个直方图点。输出:

{ "docs" : 1, "users" : 2 }
{ "docs" : 2, "users" : 0 }
{ "docs" : 3, "users" : 1 }
{ "docs" : 4, "users" : 0 }
{ "docs" : 5, "users" : 1 }

关于javascript - histogram 直方图的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56980789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com