天天看点

MongoDB对不重复数据分组进行计数

在实际环境中,经常会用到对数据进行去重计数

1、采用mongodb的distinct
db.collection.distinct("key").length
           

db 是数据库名称,collection是集合名称,key是去重的字段,根据自己的名称进行修改

MongoDB对不重复数据分组进行计数

该图显示了对uid去重后的数据总数

这种方法对大规模数据不适用,因为distinct最多只能使用16M空间,会出现下面的错误

MongoDB对不重复数据分组进行计数
2、采用MongoDB 的aggregate进行分组计数

官方文档地址 https://docs.mongodb.com/manual/aggregation/

下面是官网截图,aggregate的使用一目了然

MongoDB对不重复数据分组进行计数

aggregate基本功能是match,group。

match的功能是实现匹配功能,也就是说,会将key下面对应的value值选出来。

找出分数为9.1的电影
db.collection.aggregate([
{$match:{rating:'9.1'}},
])
           
MongoDB对不重复数据分组进行计数

现在来看,match只是一个条件查找功能,可以使用大于小于,也可以使用正则匹配。

找出评分大于等于9.0,小于等于9.2的电影
db.collection('Douban').aggregate([
    {$match:{rating:{$lte:'9.2',$gte:'9.0'}}}
    ])
           
MongoDB对不重复数据分组进行计数

接下来使用group功能

db.getCollection('Douban').aggregate([
    {$match: {rating: "9.2"}},
    {$group: {_id: "$name", count:{$sum: 1}}}
])
           

group里面定义了数据返回的字段,现在有 _id(_id 的意思是作为主键) 和 count 字段

对所有评分为 9.2 的电影进行查找,按照名称进行分组,每出现相同的电影名称,就将计数加一,这样的方式来实现对不重复数据计数

MongoDB对不重复数据分组进行计数

也上面是使用了名字作为分组,也可以不指定 _id (主键),设为 null ,此时就将所有的数据进行计数,得到的是整个数据库不重复的数据总和

MongoDB对不重复数据分组进行计数
3、利用python的集合

使用 pymongo 连接数据库后,使用循环读取每一条数据,并且将数据去重的 key 加到 python 自带的 set (集合) 里面,实现去重

import pymongo

client = pymongo.MongoClient(host='127.0.0.1', port=27017)
db = client['test']
collection = db['Douban']
all_data = collection.find({})

s = set()
count = 0
for data in all_data:
    if data['name'] not in s:
        s.add(data['name'])
        count += 1

print(count)
           

采用 name 去重

因为 find 读取到的每一条数据都是字典类型,所以要使用 data[‘name’] 去获取数据

继续阅读