python - 如何使用 python 从 mongodb 中删除重复文档?
问题描述
我已经尝试了很多脚本来删除我的 mongodb 集合中的重复行,但对我不起作用,我可以在这里找到帮助我的人吗?
from pymongo import MongoClient
client = MongoClient()
client = MongoClient("mongodb://localhost:27017/")
mydb = client.bafin
myCollection = mydb.officier
解决方案
这是比较单个集合中任何类型的数据并删除重复项的通用方法。如果你有一个庞大的数据集,有更好的方法来实现这一点,但这应该适用于一般用途。
它采用 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'}
推荐阅读
- sql - SQL 中基于所选选项的条件 Where 子句
- docker - Docker 中的配置 Nanoc 错误面临“Nanoc::Core::ConfigLoader::NoConfigFileFoundError:未找到配置文件”
- python - KML 将数据扩展到叶标记弹出窗口
- docker - 如何使用 --ulimit 选项在 docker 容器中将 POSIX 消息队列限制设置为无限制
- android - recyclerview中的nestedrecyclerview不滚动android
- json - 在 Swift 中解析 json 后返回结构
- jms - ActiveMQ 未确认消息会发生什么
- r - 带类的打印功能
- javascript - 如何从日期格式 YYYY-MM-DD 中检查两个月是否相等?
- elasticsearch - 没有为建议注册的查询