天天看點

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’] 去擷取資料

繼續閱讀