我检查了各种Stackoverflow线程,但找不到答案。
我有一个包含各种分数条目的集合,每个条目都包含有关用户当天播放的一些数据。
以下是4个文件的简化示例:
{
user_id: 1,
someint: 10,
agerange: "25-35",
score: 12345
},
{
user_id: 2,
someint: 10,
agerange: "35-45",
someotherkey: 12345
},
{
user_id: 1,
someint: 8,
agerange: "25-35",
score: 12345
},
{
user_id: 3,
someint: 10,
agerange: "13-18",
someotherkey: 12345
}
在此示例中,用户#1播放了两次。
我想获得玩家年龄范围的统计数据,而不是两次计算同一个用户。
以下是我所期待的一个例子:
{
_id: "25-35", // <- User #1 counted only once
total: 1
},
{
_id: "35-45",
total: 1
},
{
_id: "13-18",
total: 1
}
使用我到目前为止的聚合规则,用户可以计算他们玩的时间:
[{
$project: {
text: "$agerange"
}
}, {
$group: {
_id: '$text',
total: {
$sum: 1
}
}
}]
当我按UID分组时,我会在输出中获得每个用户的UI,这不是我所期望的。
似乎找不到双重分组的有效结构。
有什么想法吗?
答案 0 :(得分:2)
双组解决方案:
db.players.aggregate([
{
$group: {
_id: {user_id: '$user_id', agerange: '$agerange'}
}
},
{
$group: {
_id: '$_id.agerange',
total : {
$sum: 1
}
}
}
])
第一组
第一个$group
用于在$user_id
和$agerange
上设置不同内容。如果我仅使用$sum
执行第一个组:
数据:
db.players.find()
{ "_id" : ObjectId("529e566bfdfd61191c830099"), "user_id" : 1, "someint" : 10, "agerange" : "25-35", "score" : 12345 }
{ "_id" : ObjectId("529e5680fdfd61191c83009a"), "user_id" : 2, "someint" : 10, "agerange" : "35-45", "someotherkey" : 12345 }
{ "_id" : ObjectId("529e568ffdfd61191c83009b"), "user_id" : 1, "someint" : 8, "agerange" : "25-35", "score" : 12345 }
{ "_id" : ObjectId("529e569dfdfd61191c83009c"), "user_id" : 3, "someint" : 10, "agerange" : "13-18", "someotherkey" : 12345 }
{ "_id" : ObjectId("529e5c4cf829b266f4c3e813"), "user_id" : 2, "someint" : 8, "agerange" : "25-35", "score" : 12345 }
小组结果:
db.players.aggregate([ { $group: { _id: {user_id: '$user_id', agerange: '$agerange'}, total : { $sum: 1 } } }]);
{
"result" : [
{
"_id" : {
"user_id" : 2,
"agerange" : "25-35"
},
"total" : 1
},
{
"_id" : {
"user_id" : 3,
"agerange" : "13-18"
},
"total" : 1
},
{
"_id" : {
"user_id" : 2,
"agerange" : "35-45"
},
"total" : 1
},
{
"_id" : {
"user_id" : 1,
"agerange" : "25-35"
},
"total" : 2
}
],
"ok" : 1
}
每对情侣$user_id
/ $agerange
$sum
在我们的案例中没用,所以我删除了它
第二组
第二组应用于第一组结果。我需要计算返回$agerange
值的次数,因此我在第一组结果的$_id.agerange
上创建一个组
我希望你能清楚地知道我的英语非常糟糕:)