前言由于MongoDB限制较少,所以有时候数据库中会出现大量重复数据,尤其是爬虫数据。一旦文档数量达到一定的数据量,为了保证新插入的数据不重复,如果每次都使用update操作感觉有点慢,不如先插入一次再使用pipeline管道操作最后对重复的数据进行去重,感觉会更快。但我没有测试过。有兴趣的童鞋可以测试对比一下。MongoDB数据情况数据库有重复数据,如下:/*1*/{"_id":ObjectId("5dbaf3939642fb9adcad453c"),"username":"WangWu","area":"Shanghai"}/*2*/{"_id":ObjectId("5dbaf3a19642fb9adcad4549"),"username":"赵四","area":"北京"}/*3*/{"_id":ObjectId("5dbaf3b89642fb9adcad4556"),"username":"Maliu","area":"Beijing"}/*4*/{"_id":ObjectId("5dbaf3b89642fb9adcad4556"),"username":"Maliu","area":"Beijing"}管道操作清洗重复数据MongoDBBash命令:db.getCollection('users').aggregate([{$group:{_id:{username:'$username',area:'$area'},count:{$sum:1},dups:{$addToSet:'$_id'}}},{$match:{count:{$gt:1}}}],{allowDiskUse:true}).forEach(函数(doc){doc.dups.shift();db['用户'].remove({_id:{$in:doc.dups}});})Python3代码:frompymongoimportMongoClient,DeleteOneMONGODB_URL='mongodb://localhost:27017'col=MongoClient(MONGODB_URL)['test']['users']pipeline=[{'$group':{'_id':{'username':'$username','area':'$area'},'count':{'$sum':1},'dups':{'$addToSet':'$_id'}}},{'$match':{'count':{'$gt':1}}}]map_id=map(lambdadoc:doc['dups'][1:],col.aggregate(pipeline=pipeline,allowDiskUse=True))list_id=[子列表中子列表的项目map_id子列表中的项目]print(col.bulk_write(list(map(lambda_id:DeleteOne({'_id':_id}),list_id))).bulk_api_result)参考文章http://forum.foxera.com/mongodb/topic/967/mongodb%E5%A6%82%E4%BD%95%E5%B0%86%E9%87%8D%E5%A4%8D%E7%9A%84%E6%95%B0%E6%8D%AE%E5%88%A0%E9%99%A4
