MongoDB:具有不同的聚合

时间:2013-12-03 21:35:22

标签: mongodb

我检查了各种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,这不是我所期望的。

似乎找不到双重分组的有效结构。

有什么想法吗?

1 个答案:

答案 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上创建一个组

我希望你能清楚地知道我的英语非常糟糕:)