我有一些推文下载到我的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) }