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