mongodb去重

浏览:52日期:2023-06-27

问题描述

现在的数据是使用爬虫抓取的。现在有些数据是重复的。然后现在我想请教应该怎么做才能去重呢?我想的是只要能查到相对应的name也是ok的打个比方。我现在有个community_name字段。我想查询一下,community_name重复次数超过1次的name列表我应该怎么去查询。谢谢。文档格式:

{ '_id' : ObjectId('5732e6f884e079abfa783703'), 'buildings_num' : '4', 'community_name' : '江和城', 'address' : '新安江洋安新城,南临洋安大道、北临滨江路', 'lat' : '29.511485', 'building_year' : '2014年建成', 'lng' : ' 119.329673', 'house_num' : 224, 'id' : 84453, 'category' : '建德商圈', 'city' : '杭州', 'lj_id' : '187467387072819', 'area' : '建德', 'average_price' : 8408, 'property_cost' : '2 元/平米/月', 'property_company' : '金管家', 'volume_rate' : '1.98', 'greening_rate' : 0.33, 'developers' : '杭州和谐置业有限公司'}

问题解答

回答1:

看你的意思是想达到RDBMS中类似于

SELECT community_name, COUNT(*)FROM tableGROUP BY community_nameHAVING COUNT(*) > 1

不知道我理解对了没有。如果是这样的话,对应的方式应该是使用aggregation framework。

db.coll.aggregate([ {$group: {_id: '$community_name', count: {$sum: 1}}}, //统计community_name重复出现的次数 {$match: {count: {$gt: 1}}} //从中找出重复多于1次的记录]);

这个查询在有以下索引的情况下可以更快得到结果:

db.coll.createIndex({community_name: 1});

但是即使这样,这个查询也会遍历所有记录,速度并不会太快。实际上每次都去统计所有记录是比较浪费的,最好在得到结果后做一定的缓存,如何缓存要取决于你统计出来的数据想要怎么用。更好的办法是插入前就做一下判断,如果已经存在同样的community_name则记录在案,比如

db.community_name_stat.update({ community_name: ’xxx’}, { ’$set’: {count: {’$inc’: 1} }, ’$setOnInsert’: {community_name: ’xxx’,count: 1 }}, { upsert: true});

这样就可以直接得到一个community_name_stat集合得到每个community_name出现过多少次。当然最终的做法还是取决于你的需求。MongoDB是一个很灵活的东西,这也是它区别于关系型数据库的重要特点之一。了解它的各种功能,为你的需求定制一个性价比最高的解决方案,是使用MongoDB过程中最大的挑战之一。

回答2:

如果理解正确的话,你可以直接用upsert:如果系统已经有了相同条件的纪录,只update,否则建立新的纪录。

db.collection.update(query, update, {upsert: True, multi: <boolean>})

而且你还可以修改多条纪录,如果设置multi为true。

相关文章: