Mongodb grouby和sum and get media

Mongodb grouby和sum and get media,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的数据库中有此集合: { "IdUser" : "1", "IdItem" : "1" }, { "IdUser" : "1", "IdItem" : "2" }, { "IdUser" : "1", "IdItem" : "3" }, { "Id

我的数据库中有此集合:

{ "IdUser" : "1", "IdItem" : "1" },
{ "IdUser" : "1", "IdItem" : "2" },
{ "IdUser" : "1", "IdItem" : "3" },
{ "IdUser" : "2", "IdItem" : "4" },
{ "IdUser" : "2", "IdItem" : "5" },
{ "IdUser" : "4", "IdItem" : "6" },
{ "IdUser" : "5", "IdItem" : "7" }
如何获得此结果:

具有一个项目的用户:2

有两项的用户:1

有三项的用户:1

使用)方法将获得所需的结果,尽管输出文档的不同之处在于,您没有键/值对,而是有两个不同的字段,其值显示用户数量及其各自的属性 物品计数。以下聚合管道解释了这一点:

db.collection.aggregate([
    {
        "$group": {
            "_id": "$IdUser",
            "count": { 
                "$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] } 
            }            
        }
    },
    {
        "$group": {
            "_id": "$count",
            "users": { "$push": "$_id" }            
        }
    },
    {
        "$project": {
            "_id": 0, 
            "number_of_items": "$_id", 
            "number_of_users": { "$size": "$users" } 
        }
    }
])
在上面的示例中,您可以通过用户键查看所有文档,以获取它们的计数,同时考虑到可能没有项目字段的文档,这些文档将在合计中打折。需要进一步的操作,然后以数组的形式获取每次计数的用户数

管道中的最后一步是重塑最终输出,以便获得以下输出(与问题一起提供的示例文档):

您需要首先通过
IdUser
记录文档,然后使用累加器操作符计算每个
IdUser
出现在集合中的时间。这允许您在下一阶段按“计数”对文档进行分组,并返回具有相同数量“项”的“用户”计数

db.items.aggregate([
{“$group”:{
“_id”:“$IdUser”,
“计数”:{“$sum”:1}
}}, 
{“$group”:{
“_id”:“$count”,
“nUsers”:{“$sum”:1}
}}
])
{ "number_of_items" : 1, "number_of_users" : 2 }
{ "number_of_items" : 3, "number_of_users" : 1 }
{ "number_of_items" : 2, "number_of_users" : 1 }