爬取了一个用户的论坛数据,但是这个数据库中有重复的数据,于是我想把重复的数据项给去掉。数据库的结构如下
里边的forundata是这个帖子的每个楼层的发言情况。
但是因为帖子爬取的时候有可能重复爬取了,我现在想根据里边的urlId来去掉重复的帖子,但是在去除的时候我想保留帖子的forumdata(是list类型)字段中列表长度最长的那个。
用mongodb的distinct方法只能返回重复了的帖子urlId,都不返回重复帖子的其他信息,我没法定位。。。假如重复50000个,那么我还要根据这些返回的urlId去数据库中find之后再在mongodb外边代码修改吗?可是即使这样,我发现运行的时候速度特别慢。
之后我用了group函数,但是在reduce函数中,因为我要比较forumdata函数的大小,然后决定保留哪一个forumdata,所以我要传入forumdata,但是有些forumdata大小超过了16M,导致报错,然后这样有什么解决办法吗?
或者用第三种方法,用Map_reduce,但是我在map-reduce中的reduce传入的forumdata大小限制竟然是8M,还是报错。。。
代码如下
group的代码:
reducefunc=Code(
'function(doc,prev){'
'if (prev==null){'
'prev=doc'
'}'
'if(prev!=null){'
'if (doc.forumdata.lenth>prev.forumdata.lenth){'
'prev=doc'
'}'
'}'
'}'
)
map_reduce的代码:
reducefunc=Code(
'function(urlId,forumdata){'
'if(forumdata.lenth=1){'
'return forumdata[0];'
'}'
'else if(forumdata[0].lenth>forumdata[1].lenth){'
'return forumdata[0];'
'}'
'else{'
'return forumdata[1]}'
'}'
)
mapfunc=Code(
'function(){'
'emit(this.urlId,this.forumdata)'
'}'
)
望各位高手帮我看看这个问题该怎么解决,三个方案中随便各一个就好,或者重新帮我分析一个思路,感激不尽。
鄙人新人,问题有描述不到位的地方请提出来,我会立即补充完善。
如果这个问题还没有解决,不妨参考下面的想法:
1、MongoDB中推荐使用aggregation,而不推荐使用map-reduce;
2、您的需求中,很重要的一点是获取Forumdata的长度:数组的长度,从而找到数组长度最长的document。您原文说Forumdata是列表(在MongoDB中应该是数组);MongoDB提供了$size运算符号取得数组的大小。
请参考下面的栗子:
3、有了上面的数据后,然后可以利用aggregation中的$sort,$group等找到满足您的需求的Document的objectId,具体做法可以参考下面的帖子:
https://segmentfault.com/q/10...
4、最后批量删除相关的ObjectId
类似于:
var dupls = [] 保存要删除的objectId
db.collectionName.remove({_id:{$in:dupls}})
供参考。
Love MongoDB! Have Fun!
戳我<--请戳左边,就在四月!MongoDB中文社区深圳用户大会开始报名啦!大神云集!