聚合数据以按数组的第一个值分组
Posted
技术标签:
【中文标题】聚合数据以按数组的第一个值分组【英文标题】:Aggregate data to group by first value of an array 【发布时间】:2020-02-26 02:27:38 【问题描述】:假设我的数据库中有以下数据,我想聚合一些按第一个目标得分值分组的数据。
"_id" : ObjectId("5d7f6a937563a63c1d8b4639"),
"target" : [
"score" : 3
,
"score" : 2
]
,
"_id" : ObjectId("5d7f6a937563a63c1d8b4640"),
"target" : [
"score" : 1
,
"score" : 4
]
所以我正在尝试这样做:
data.aggregate(
[
$match: 'target.0.score': $exists: true
,
$group:
_id: '$target.0.score',
Datasets: $sum: 1
]
)
在我的代码中我正在做一些平均计算,这就是我使用聚合方法的原因
查询的结果是
[ _id: [], Datasets: 2 ]
但我会期待
[
_id: 3, Datasets: 1 ,
_id: 1, Datasets: 1
]
_id
应该是分组的分数值与该分数的所有数据集的计数(以及该组的一些平均计算)
【问题讨论】:
这是一种查找/匹配语法来访问数组中的元素。对于 $group,您需要使用 $arrayElemAt。见***.com/questions/39196537/… @AlexBlex 但是$arrayElemAt: ['$target', 0]
给了我对象。我需要得到分数值。
~只用$let,看我的回答~看卢卡斯的回答
@AlexBlex 你为什么删除你的答案。它正在工作。卢卡斯的回答没有考虑score
字段。
很公平。我取消了我的删除以显示另一种方法,并更正了卢卡斯的方法以使用score
。在这种特殊情况下,额外的阶段更好。 $addFields 而不是 $project 可能更灵活一些。
【参考方案1】:
我很确定它已经回答了,但无论如何:
data.aggregate(
[
$match: 'target.0.score': $exists: true
,
$group:
_id: $let:
vars: t0: $arrayElemAt:["$target", 0],
in: "$$t0.score"
,
Datasets: $sum: 1
]
)
【讨论】:
【参考方案2】:如果要按第一个目标分数分组,首先需要project
第一个目标分数,然后按它分组:
data.aggregate(
[
$match: 'target.0.score': $exists: true
,
$project:
first_target_score:
$arrayElemAt: [
'$target', 0
]
,
$group:
_id: '$first_target_score.score',
Datasets: $sum: 1
]
)
我很确定这会起作用,但我现在没有办法测试它,只是试一试
【讨论】:
以上是关于聚合数据以按数组的第一个值分组的主要内容,如果未能解决你的问题,请参考以下文章