gpt4 book ai didi

node.js - 如何使用 mongodb 聚合计算数组字段的百分比?

转载 作者:行者123 更新时间:2023-12-02 21:33:37 24 4
gpt4 key购买 nike

我有以下文件

users = [
{
type: 'A',
name: 'anil',
logins: [
{ at: '2-3-2019', device: 'mobile' },
{ at: '3-3-2019', device: 'desktop' },
{ at: '4-3-2019', device: 'tab' },
{ at: '5-3-2019', device: 'mobile' }
]
},
{
type: 'A',
name: 'rakesh',
logins: [
{ at: '2-3-2019', device: 'desktop' },
{ at: '3-3-2019', device: 'mobile' },
{ at: '4-3-2019', device: 'desktop' },
{ at: '5-3-2019', device: 'tab' }
]
},
{
type: 'A',
name: 'rahul',
logins: [
{ at: '2-3-2019' device: 'tab' },
{ at: '3-3-2019' device: 'mobile' },
{ at: '4-3-2019' device: 'tab' },
{ at: '5-3-2019' device: 'tab' }
]
}
]

我需要计算每个用户使用“A”类型设备的百分比。

如果我们查看用户anil的设备使用情况,

mobile: 50%
desktop: 25%
tab: 25%

使用率最高的是使用率50%的移动设备,因此应将其视为移动设备。就像上面的最终输出一样,

[
{
name: 'anil',
device: 'mobile',
logins: 50%
},
{
name: 'rakesh',
device: 'desktop',
logins: 50%
},
{
name: 'rahul',
device: 'tab',
logins: 75%
}
]

感谢您的帮助。

最佳答案

您可以使用以下聚合

这里的总体逻辑是查找数组内的重复项,之后您只需要做 $map通过 logins 数组使用公式计算设备的百分比

(numberOfDevices * 100) / total size of the array

如果您从下面的聚合中逐一删除阶段来理解它会更好。

db.collection.aggregate([
{ "$match": { "type": "A" }},
{ "$addFields": {
"logins": {
"$arrayToObject": {
"$map": {
"input": { "$setUnion": ["$logins.device"] },
"as": "m",
"in": {
"k": "$$m",
"v": {
"$divide": [
{
"$multiply": [
{ "$size": {
"$filter": {
"input": "$logins",
"as": "d",
"cond": {
"$eq": ["$$d.device", "$$m"]
}
}
}},
100
]
},
{ "$size": "$logins" }
]
}
}
}
}
}
}}
])

MongoPlayground

[
{
"_id": ObjectId("5a934e000102030405000000"),
"logins": {
"desktop": 25,
"mobile": 50,
"tab": 25
},
"name": "anil",
"type": "A"
},
{
"_id": ObjectId("5a934e000102030405000001"),
"logins": {
"desktop": 50,
"mobile": 25,
"tab": 25
},
"name": "rakesh",
"type": "A"
},
{
"_id": ObjectId("5a934e000102030405000002"),
"logins": {
"mobile": 25,
"tab": 75
},
"name": "rahul",
"type": "A"
}
]

精确输出-> 在这里我刚刚找到 $max获取所有设备的百分比后,从对象数组中提取元素。

db.collection.aggregate([
{ "$match": { "type": "A" }},
{ "$addFields": {
"logins": {
"$map": {
"input": { "$setUnion": ["$logins.device"] },
"as": "m",
"in": {
"k": "$$m",
"v": {
"$divide": [
{
"$multiply": [
{ "$size": {
"$filter": {
"input": "$logins",
"as": "d",
"cond": {
"$eq": ["$$d.device", "$$m"]
}
}
}},
100
]
},
{ "$size": "$logins" }
]
}
}
}
}
}},
{ "$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$$ROOT",
{
"$arrayElemAt": [
"$logins",
{
"$indexOfArray": [
"$logins.v",
{ "$max": "$logins.v" }
]
}
]
}
]
}
}},
{ "$project": { "logins": 0 }}
])

MongoPlayground

[
{
"_id": ObjectId("5a934e000102030405000000"),
"k": "mobile",
"name": "anil",
"type": "A",
"v": 50
},
{
"_id": ObjectId("5a934e000102030405000001"),
"k": "desktop",
"name": "rakesh",
"type": "A",
"v": 50
},
{
"_id": ObjectId("5a934e000102030405000002"),
"k": "tab",
"name": "rahul",
"type": "A",
"v": 75
}
]

关于node.js - 如何使用 mongodb 聚合计算数组字段的百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59005762/

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