1

我有这样的数据

{ "_id": "1234gbrghr",
  "Device" : "samsung",
  "UserId" : "12654",
  "Month" : "july"
},

{ "_id": "1278gbrghr",
  "Device" : "nokia",
  "UserId" : "87654",
  "Month" : "july"
},

{ "_id": "1234gbrghr",
  "Device" : "samsung",
  "UserId" : "12654",
  "Month" : "july"
}

我需要在 7 月份获得特定设备的不同用户编号。例如“如果用户(UserId)在 7 月份使用三星设备两次或更多次,那么它将计入三星设备。

为此,我使用此查询来获取 7 月份的用户总数。但我需要得到不同的用户

pipeline1 = [

            {'$match':{'Month':'july'}},
            {'$group':{'_id' : '$Device', 'count' : { '$sum' : 1 }}}
          ]
    data = db.command('aggregate', 'collection', pipeline=pipeline1);
4

1 回答 1

1

您需要先对设备用户进行分组。您可以使用以下管道运算符执行此操作:

{'$group':{'_id' : { d: '$Device', u: '$UserId' } } }

其次,您需要计算每个用户的设备数量(就像您已经拥有的一样,但稍作修改:

{ '$group': { '_id' : '$_id.d', 'count': { '$sum' : 1 } } }

使用以下数据集:

{ "_id" : "1234gbrghr", "Device" : "samsung", "UserId" : "12654", "Month" : "july" }
{ "_id" : "1278gbrghr", "Device" : "nokia", "UserId" : "87654", "Month" : "july" }
{ "_id" : "1239gbrghr", "Device" : "samsung", "UserId" : "12654", "Month" : "july" }
{ "_id" : "1238gbrghr", "Device" : "samsung", "UserId" : "12653", "Month" : "july" }

以及以下聚合命令:

db.so.aggregate( [
    { '$match' : {'Month' : 'july' } },
    { '$group' : {
        '_id' : { d: '$Device', u: '$UserId' },
        'count' : { '$sum' : 1 }
    } }, 
    { '$group': {
        '_id' : '$_id.d',
        'count': { '$sum' : 1 }
    } }
] );

这输出:

{
    "result" : [
        {
            "_id" : "nokia",
            "count" : 1
        },
        {
            "_id" : "samsung",
            "count" : 2
        }
    ],
    "ok" : 1
}
于 2013-07-23T08:34:41.810 回答