Mongdb 删除重复数据python-pymongo实现

1.mongodb的实现

mongodb删除重复数据保留一条_生有涯,知无涯-CSDN博客_mongodb删除重复记录保留id最小


大家可以可以参考一下这位博主的demo,纯mongo语言,但可能是我的mongodb的版本问题还是其他问题,并且对mongodb的语法不是很熟悉,也看得不咋懂,但是大概思路理解,但是运行不了,于是我就写了python的版本。

2.python的实现

2.1数据展现

首先咋们看看数据长啥样

其实这个数据是csv文件,是老师给我们的数据,总共5w+,我做完才发现,数据本来是没问题的,最后发现重复的只有4条,最后保留一条,总共删了3条,我个人猜测老师是随机找到一条记录然后复制了三份....,个人认为mongodb去重操作太麻烦,没有mysql那么简单,直接distinct,哈哈哈哈哈哈哈,最后将该数据导入mongodb中。

导入后数据如下:

红色圈起来的是每一条记录的唯一主键。

2.2代码

注意!!!我的pymongo库的版本位3.12.0,mongo的版本位4.2.17,不同的版本可能出现报错,例如有些版本并没有count这个功能,还有mongo版本过低,pymongo版本过高可能会导致连接不了等等问题,如果要安装指定版本库,在cmd窗口输入:pip install pymongo==3.12.0即可。

import pymongo
from pymongo import MongoClient
#连接mongodb
client = MongoClient()
collection = client.db.data2
print(client)

 #分组查询找到条目数大于1的记录
doc = collection.aggregate([{'$group':
                             {'_id': 
                              {'CardNo':'$CardNo','PeoNo':'$PeoNo','Date':'$Date','Money':'$Money','FundMoney':'$FundMoney','Surplus':'$Surplus','CardCount':'$CardCount','Type':'$Type','TermSerNo':'$TermSerNo','conOperNo':'$conOperNo','Dept':'$Dept'},
                              'count' : {'$sum': 1}}},
                            {'$match': {'count': {'$gt': 1}}}],allowDiskUse = True)  
for i in doc:
    print(i)

分组后发现有4条记录重复,于是要删除3条,保留一条,基本思路就是查询满足上述上述值的记录的唯一键“_id”,然后删除唯一键对应的数据(mongo的delete函数可提供删除api),但不能全删,全删就不叫去重了,应该保留一条,所以这里要删3条。

找到上述值的记录,获取该记录的唯一键"_id",跳过第一条记录,删除我们获取所要删除唯一键“_id”的记录

查看删除前有多少条记录,不管了,说多没用,直接上代码。

doc = collection.aggregate([{'$group':
                             {'_id': 
                              {'CardNo':'$CardNo','PeoNo':'$PeoNo','Date':'$Date','Money':'$Money','FundMoney':'$FundMoney','Surplus':'$Surplus','CardCount':'$CardCount','Type':'$Type','TermSerNo':'$TermSerNo','conOperNo':'$conOperNo','Dept':'$Dept'},
                              'count' : {'$sum': 1}}},
                            {'$match': {'count': {'$gt': 1}}}],allowDiskUse = True)   #分组查询找到条目数大于1的记录
for i in doc:   #遍历每一个大于1的记录,删除第一条以后的记录
    first = 1   #定义0/1变量 判断是否为第一条  1:是  0:不是
    for j in collection.find(i["_id"]):
        if first == 1:
            first = 0  #等于0后说明不是第一条,第一条后的记录要删除
            continue
        else:   #firt != 1  删除重复记录除第一条后面的数据
            collection.delete_one({"_id":j["_id"]})

发现有四条重复数据,所以我们要删除其中的三条,基本思路就是用mongodb的条件筛选找到值为上图字典中键为“_id”的值的记录。

最后总共删除了3条数据


版权声明:本文为weixin_49583390原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。