gpt4 book ai didi

MongoDB聚合查询以计算用户和支付模型分离时的ARPU

转载 作者:可可西里 更新时间:2023-11-01 09:32:53 27 4
gpt4 key购买 nike

我想编写一个聚合查询来计算 ARPU(每个用户的平均收入),但我一直在研究如何使用来自的数据来分离模型,我知道我可以使用 $lookup 加入模型但我无法以这种方式统计所有用户。

这些是我的模型:

// User:
{
_id,
username: String,
os: String
}

// Payment:
{
_id,
user: ObjectId,
price: Number
}

我需要计算所有付款的总和除以所有用户的数量。

之后我需要按操作系统对它们进行分组,即具有 os='os1' 的用户支付的所有款项的总和除以拥有 os='os1' 的所有用户数对于每个操作系统

编辑

例如,用户的样本数据是:

{
"_id" : ObjectId("5b77fdffcbbd830011dbc04e"),
"username" : "user1",
"os" : "android"
},
{
"_id" : ObjectId("5b7856756aaf56001120816b"),
"username" : "user2",
"os" : "android"
},
{
"_id" : ObjectId("5b824fa7234d1b0010310522"),
"username" : "user3",
"os" : "android"
},
{
"_id" : ObjectId("5b8a242444074c0074b8a318"),
"username" : "user4",
"os" : "ios"
},
{
"_id" : ObjectId("5b7801b0cbbd830011dbc050"),
"username" : "user5",
"os" : "ios"
}

付款的样本数据是:

{
"_id" : ObjectId("5bab61b617df7f173037fb1b"),
"user" : ObjectId("5b77fdffcbbd830011dbc04e"), // user1
"price" : 5
},
{
"_id" : ObjectId("5bad4f980ab23100119300ec"),
"user" : ObjectId("5b77fdffcbbd830011dbc04e"), // user1
"price" : 10
},
{
"_id" : ObjectId("5bad525edeed4e0011286842"),
"user" : ObjectId("5b7856756aaf56001120816b"), // user2
"price" : 5
},
{
"_id" : ObjectId("5bad525edeed4e0011286848"),
"user" : ObjectId("5b8a242444074c0074b8a318"), // user4
"price" : 5
},
{
"_id" : ObjectId("5bad525edeed4e0011286849"),
"user" : ObjectId("5b8a242444074c0074b8a318"), // user4
"price" : 15
}

我的预期输出是使用聚合查询获得的数字。

最初我想要的是每个用户的平均收入:

ARPU: {sum of all payments} / {count of all users} = 40 / 5 = 8

如果我能做到这一点,那么我需要为每个操作系统对它们进行分组:

ios-ARPU: {sum of payments ios users made} / {count of ios users} = 20 / 2 = 10

android-ARPU: {sum of payments android users made} / {count of android usrs} = 20 / 3 = 6.67

  • 请注意,有些用户可能不支付任何费用,但在计算 ARPU 时需要将其计算在内。

最佳答案

您可以从 $lookup 开始然后使用 $reduce计算每个用户的 totalPayments。然后你可以$group通过 null 获取包含用户总数和总付款的单个文档。要获得 ARPU,您需要 $divide在最后一步。

db.users.aggregate([
{
$lookup: {
from: "payments",
localField: "_id",
foreignField: "user",
as: "payments"
}
},
{
$project: {
_id: 1,
os: 1,
totalPayments: {
$reduce: {
input: "$payments",
initialValue: 0,
in: {
$add: [ "$$value", "$$this.price" ]
}
}
}
}
},
{
$group: {
_id: null,
totalUsers: { $sum: 1 },
totalPayments: { $sum: "$totalPayments" }
}
},
{
$project: {
arpu: { $divide: [ "$totalPayments", "$totalUsers" ] }
}
}
])

输出:{ "arpu": 8 }

要获得每个操作系统的 arpu,您只需按 $os 进行 $group:

{
$group: {
_id: "$os",
totalUsers: { $sum: 1 },
totalPayments: { $sum: "$totalPayments" }
}
}

打印:

{ "_id" : "ios", "arpu" : 10 }
{ "_id" : "android", "arpu" : 6.666666666666667 }

关于MongoDB聚合查询以计算用户和支付模型分离时的ARPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53929618/

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