MongoDB:具有不同

MongoDB:具有不同,mongodb,Mongodb,我检查了各种Stackoverflow线程,没有找到答案 我有一个包含各种分数条目的集合,每个条目都包含用户玩游戏当天的一些数据 以下是4个文档的简化示例: { user_id: 1, someint: 10, agerange: "25-35", score: 12345 }, { user_id: 2, someint: 10, agerange:

我检查了各种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
}
当我按UID分组时,我在输出中得到每个用户的UI,这不是我所期望的

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


有什么想法吗?

双组解决方案:

db.players.aggregate([    
{
    $group: {
        _id: {user_id: '$user_id', agerange: '$agerange'}
    }
},
{
    $group: {
        _id: '$_id.agerange',
        total : {
            $sum: 1
        }
    }
}
])
第一组

第一个
$group
用于对
$user\u id
$agerange
进行区分。如果仅使用
$sum
执行第一个组:

数据:

小组结果:

我每对夫妇有一个对象
$user\u id
/
$agerange

$sum
在我们的案例中是无用的,所以我删除了它

第二组

第二组应用于第一组结果。我需要计算返回
$agerange
值的次数,因此我在第一组结果的
$\u id.agerange
上创建一个组


我希望你清楚我的英语很差:)

工作得很好!这也有助于我理解这种查询的结构。谢谢谢谢我理解它的工作方式,但你的补充解释可能会帮助那些也在寻找答案的人。查询已经在我们的stats界面上生成。
db.players.aggregate([    
{
    $group: {
        _id: {user_id: '$user_id', agerange: '$agerange'}
    }
},
{
    $group: {
        _id: '$_id.agerange',
        total : {
            $sum: 1
        }
    }
}
])
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
}