在實際環境中,經常會用到對資料進行去重計數
1、采用mongodb的distinct
db.collection.distinct("key").length
db 是資料庫名稱,collection是集合名稱,key是去重的字段,根據自己的名稱進行修改
該圖顯示了對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’] 去擷取資料