說明
由於最開始抓取數據時,出於疏忽,將圖片數據存入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')
歡迎留言交流,以上。