【发布时间】: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。见stackoverflow.com/questions/39196537/…
-
@AlexBlex 但是
$arrayElemAt: ['$target', 0]给了我对象。我需要得到分数值。 -
~只用$let,看我的回答~看卢卡斯的回答
-
@AlexBlex 你为什么删除你的答案。它正在工作。卢卡斯的回答没有考虑
score字段。 -
很公平。我取消了我的删除以显示另一种方法,并更正了卢卡斯的方法以使用
score。在这种特殊情况下,额外的阶段更好。 $addFields 而不是 $project 可能更灵活一些。