MongoDB推文标签的巧合计数



我有一些推文下载到我的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。有什么想法吗?

没有聚合管道或查询可以从给定的文档结构中计算出这一点,因此,如果您不想大幅更改集合结构或构造辅助集合,则必须使用 map/reduce。然而,map/reduce很简单:在map阶段,为文档中的每一对主题标签发出一对(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) }

相关内容

  • 没有找到相关文章

最新更新