mongodb删除重复数据保留一条_生有涯,知无涯-CSDN博客_mongodb删除重复记录保留id最小
大家可以可以参考一下这位博主的demo,纯mongo语言,但可能是我的mongodb的版本问题还是其他问题,并且对mongodb的语法不是很熟悉,也看得不咋懂,但是大概思路理解,但是运行不了,于是我就写了python的版本。
首先咋们看看数据长啥样
其实这个数据是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条数据
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)