在实际环境中,经常会用到对数据进行去重计数
1、采用mongodb的distinct
db.collection.distinct("key").length
db 是数据库名称,collection是集合名称,key是去重的字段,根据自己的名称进行修改
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLzATO0QTNyUTM4ETMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
该图显示了对uid去重后的数据总数
这种方法对大规模数据不适用,因为distinct最多只能使用16M空间,会出现下面的错误
2、采用MongoDB 的aggregate进行分组计数
官方文档地址 https://docs.mongodb.com/manual/aggregation/
下面是官网截图,aggregate的使用一目了然
aggregate基本功能是match,group。
match的功能是实现匹配功能,也就是说,会将key下面对应的value值选出来。
找出分数为9.1的电影
db.collection.aggregate([
{$match:{rating:'9.1'}},
])
现在来看,match只是一个条件查找功能,可以使用大于小于,也可以使用正则匹配。
找出评分大于等于9.0,小于等于9.2的电影
db.collection('Douban').aggregate([
{$match:{rating:{$lte:'9.2',$gte:'9.0'}}}
])
接下来使用group功能
db.getCollection('Douban').aggregate([
{$match: {rating: "9.2"}},
{$group: {_id: "$name", count:{$sum: 1}}}
])
group里面定义了数据返回的字段,现在有 _id(_id 的意思是作为主键) 和 count 字段
对所有评分为 9.2 的电影进行查找,按照名称进行分组,每出现相同的电影名称,就将计数加一,这样的方式来实现对不重复数据计数
也上面是使用了名字作为分组,也可以不指定 _id (主键),设为 null ,此时就将所有的数据进行计数,得到的是整个数据库不重复的数据总和
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’] 去获取数据