mongodb去重

查看:86
本文介绍了mongodb去重的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

现在的数据是使用爬虫抓取的。现在有些数据是重复的。
然后现在我想请教应该怎么做才能去重呢?
我想的是只要能查到相对应的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" : "杭州和谐置业有限公司"
}

解决方案

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

SELECT community_name, COUNT(*)
FROM table
GROUP BY community_name
HAVING 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过程中最大的挑战之一。

这篇关于mongodb去重的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆