Mongodb操作(二):批量查重及去重

一、查询重复数据

    result_list = collection.aggregate([
        {'$group': {'_id': {'tid': '$tid', 'author_name': '$author_name', 'content': '$content'}, 'count': {'$sum': 1}}}, 
        {'$match': {'count': {'$gt': 1}}}
   ])
    for result in result_list:
        print(result)

输出结果中count为重复次数
在这里插入图片描述

二、去除重复数据(forEach函数)

db.collection.aggregate([
{
	'$group':{'_id':{'tid': '$tid', 'author_name': '$author_name', 'content': '$content'},'count':{'$sum':1},'dups':{'$addToSet':'$_id'}}
},
{
	'$match':{'count':{'$gt':1}}
}
],{
	allowDiskUse:true
}).forEach(function(doc){
	doc.dups.shift();
	db.collection.remove({_id:{$in:doc.dups}});
})

由于这个forEach函数引入doc会报错,暂未得到解决,所以考虑通过遍历去重。

# 参数解释1)根据author_name、tid等分组并统计数量,$group只会返回参与分组的字段,使用$addToSet在返回结果数组中增加_id字段
(2)使用$match匹配数量大于1的数据
(3)doc.dups.shift();作用是剔除重复数据其中一个_id,让后面的删除语句不会删除所有数据
(4)使用forEach循环根据_id删除数据
(5)$addToSet 操作符只有在值没有存在于数组中时才会向数组中添加一个值。如果值已经存在于数组中,$addToSet返回,不会修改数组。
(6)allowDiskUse: true        
数据过大会报内存错误:Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in       
可以在后面添加上这个属性就不会了。数据不大的情况下,可以不用试一下

注意:forEach和$addToSet的驼峰写法不能全部写成小写,因为mongodb严格区分大小写。

三、去除重复数据(遍历去重)

    for result in result_list:
        print(result)
        # 对重复数组中第一条数据进行操作
        for item in collection.find(result['_id'])[0]:
            print(item)
        # 对除第一条数据外其他数据进行:删除或者更新,这里是删除
        for item in collection.find(result['_id'])[1:result['count']]:
            print(item)
            collection.delete_one(item)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值