Mongodb 刪除重複資料的幾個方法

肖老闆發表於2017-07-10

Mongodb 刪除重複的資料

最近在處理一些專利資料,從專利局爬資料的時候,總會間隙性出現中斷,為了保證資料的完整性就進行了一些重複下載。將資料從幾萬個Excel表格中匯入Mongodb後,第一步就是要去掉重複的資料。我的第一反應是寫個Python小指令碼,結果在執行的時候,由於資料量確實比較大,有十幾萬條,執行了半個小時仍不見結束。這時候才想著使用資料庫的查詢命令是不是可以實現去重複的功能。簡單搜尋實踐後總結如下:
1. 使用Python小指令碼去重複的程式碼:

# -*- coding: utf-8 -*-
#
# @Author yxiao@aliyun.com
#

import os
import io
import sys
from pymongo import *

reload(sys)  
sys.setdefaultencoding( "utf-8" )

client = MongoClient(address, port)
db_data = client.db_name
collection_patent = db_data.collection_name

patents = {}
count = 0
for patent_record in collection_patent.find({"_id":{"$ne":0}}):
    if patent_record['public_no'] not in patents.keys():
        patents[patent_record['public_no']] = patent_record
    else:
        count += 1
        collection_patent.delete_one({"public_no":patent_record['public_no']})
print count

2.使用ensureIndex建立索引來刪除重複記錄,此命令適用於Mongodb 3.0以下版本。在Mongodb3.0以上版本,ensureIndex已經被createIndex取代了,同時dropDups選項也已經被移除了,所以不能再使用以上命令來去掉重複資料:

db.your_collection.ensureIndex({public_no:1}, {unique: true, dropDups: true})

3.下面提供一種比較簡單的巧方法:

  1. 將資料匯出為JSON格式存檔:
    mongoexport.exe -d database_name -c collection_name -o filename.json
  2. 清空當前集合的資料:
    db.yourcollection.remove({})
  3. 新建唯一索引:
    db.yourcollection.createIndex({public_no:1}, {unique:true})
  4. 匯入之前存檔的JSON檔案資料:
    mongoimport -d database_name -c collection_name --upsert filename.json
    用到的幾個引數選項說明:-d 資料庫名 -c 集合名 -o 匯出後的目錄及檔名 --upsert 會根據唯一索引去掉重複記錄

相關文章