python進行mongodb-gridfs去重

說明

由於最開始抓取數據時,出於疏忽,將圖片數據存入mongodb時查詢圖片是否已存在這部分代碼出錯,導致mongodb中存在大量重複的圖片,因此需要對數據庫進行去重操作。
而我採用了mongodb提供的GridFS功能來管理圖片,與一般的文檔去重有所區別,因此經過嘗試和摸索後,得到如下解決方案,效率較低,但能有效解決問題。

代碼

#-*-coding:utf-8-*-
from pymongo import MongoClient
import json
from gridfs import *
from datetime import datetime

def delete_repeat_data(ip):
    beginTime = datetime.now()
    print beginTime
    client = MongoClient(ip, 27017)   
    oldDB = client.olddb
    oldFS = GridFS(oldDB, collection="images")
    collection = oldDB.images.files

    newDB = client.newdb 
    newFS = GridFS(newDB, collection="images")
    num = 0
    for photo_id in collection.distinct('photo_id'):# 使用distinct方法,獲取每一個獨特的元素列表,不能直接對fs進行類似操作,會報錯
        flag = True
        for dic in oldFS.find({"photo_id":photo_id}): # 此處字段根據需求設置。fs.find返回值爲GridOutCursor,需要遍歷獲取其中數據,由於同一id對應的數據相同,因此設置flag進行標記,只保存一條記錄即可。
            if not flag:
                break
            # 得到圖片屬性數據
            photoDic = {"photo_title":dic.photo_title, "owner_id":dic.owner_id, "owner_name":dic.owner_name, "photo_id":photo_id, "width":dic.width,
                "longitude":dic.longitude, "latitude":dic.latitude, "tags":dic.tags, "dateupload":dic.dateupload, "photo_url":dic.photo_url, 
                "height":dic.height,  "datetaken":dic.datetaken}
            if newFS.find_one({"photo_id":photo_id}): # 如果此圖片在新數據庫中已存在,則不保存。一般來說,不需要這段代碼,有點多此一舉
                break
            newFS.put(dic.read(), **photoDic) # 將圖片數據存入新數據庫中
            #print photo_id
            num += 1
            flag =False
        if num%1000==0:
            print num, datetime.now(), datetime.now()-beginTime

if __name__ == '__main__':
    delete_repeat_data('localhost')

歡迎留言交流,以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章