首页 > 解决方案 > 如何使用 python 从 mongodb 中删除重复文档?

问题描述

我已经尝试了很多脚本来删除我的 mongodb 集合中的重复行,但对我不起作用,我可以在这里找到帮助我的人吗?

from pymongo import MongoClient
client = MongoClient()
client = MongoClient("mongodb://localhost:27017/") 
mydb = client.bafin
myCollection = mydb.officier

标签: pythonmongodb

解决方案


这是比较单个集合中任何类型的数据并删除重复项的通用方法。如果你有一个庞大的数据集,有更好的方法来实现这一点,但这应该适用于一般用途。

它采用 JSON 格式的记录的 md5 哈希,并将其与先前找到的数据进行比较。任何匹配和记录被删除。删除哪个版本是任意的;如果需要,您可以在初始查找上指定排序。

谨慎使用 - 这确实会删除数据!

from pymongo import MongoClient
from hashlib import md5
from bson.json_util import dumps

db = MongoClient()['mydatabase']

db.mycollection.insert_many([{'name': 'same'},
                             {'name': 'same'},
                             {'name': 'different'},
                             {'name': 'same'},
                             {'name': 'same'}])

record_hashes = set()

for record in db.mycollection.find():
    record_id = record.pop('_id')
    record_hash = md5(dumps(record).encode("utf-8")).hexdigest()

    if record_hash in record_hashes:
        db.mycollection.delete_one({'_id': record_id})
    else:
        record_hashes.add(record_hash)

for record in db.mycollection.find():
    print(record)

印刷:

{'_id': ObjectId('6054fb89c9cac53fbea4e130'), 'name': 'same'}
{'_id': ObjectId('6054fb89c9cac53fbea4e132'), 'name': 'different'}

推荐阅读