MongoDB推文标签重合计数

时间:2014-12-25 13:45:52

标签: mongodb twitter mapreduce

我有一些推特下载到我的mongodb。 推文文件看起来像这样:

{
    "_id" : NumberLong("542499449474273280"),
    "retweeted" : false,
    "in_reply_to_status_id_str" : null,
    "created_at" : ISODate("2014-12-10T02:02:02Z"),
    "hashtags" : [
       "Canucks",
       "allhabs",
       "GoHabsGo"
    ]
    ...
}

我想要一个构造一个查询/聚合/ map-reduce,它会给我一些具有相同两个哈希标签的推文。对于每对不相等的主题标签,它给出了推文的数量,例如:

{'count': 12, 'pair': ['malaria', 'Ebola']}
{'count': 1, 'pair': ['Nintendo', '8bit']}
{'count': 1, 'pair': ['guinea', 'Ebola']}
{'count': 1, 'pair': ['fitness', 'HungerGames']}
...

我已经制作了python脚本来执行此操作:

hashtags = set()

tweets = db.tweets.find({}, {'hashtags':1})
#gather all hashtags from every tweet
for t in tweets:
    hashtags.update(t['hashtags'])

hashtags = list(hashtags)

hashtag_count = []
for i, h1 in enumerate(hashtags):
    for j, h2 in enumerate(hashtags):
        if i > j:
            count = db.tweets.find({'hashtags' : {'$all':[h1,h2]}}).count()
            if count > 0:
                pair = {'pair' : [h1, h2], 'count' : count}
                print(couple)
                db.hashtags_pairs.insert(pair)

但我想用查询或JS函数来使用map-reduce。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

没有可以根据给定文档结构计算此内容的聚合管道或查询,因此如果您不想彻底更改集合结构,则必须使用map / reduce构建二级集合。但是,map / reduce非常简单:在map阶段,为文档中的每对hashtags发出一对(pair of hashtags, 1),然后对reduce阶段中每个键的值求和。

var map = function() { 
    var tags = this.tags;
    var k = tags.length; 
    for (var i = 0; i < k; i++) { 
        for (var j = 0; j < i; j++) { 
            if (tags[i] != tags[j]) { 
                var ts = [tags[i], tags[j]].sort(); 
                emit({ "t0" : ts[0], "t1" : ts[1] }, 1) 
            }
        }
    }
}

var reduce = function(key, values) { return Array.sum(values) }