2014-12-25 50 views
0

我有一些鳴叫下載到我的MongoDB。 在Twitter上發佈的文件看起來是這樣的: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" 
    ] 
    ... 
} 

我想構建一個查詢/匯聚/地圖,減少,這將使我有相同的兩個哈希標籤鳴叫的次數。對於每一對不相等的主題標籤它給了我

{'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

沒有任何聚合管道或查詢可以從給定的文檔結構中計算出來,所以如果您不想大幅度更改集合結構或構建二級集合,則必須使用map/reduce。但是,映射/縮減很簡單:在映射階段,爲文檔中的每個hashtags對發射一對(pair of hashtags, 1),然後在縮小階段對每個鍵的值進行求和。

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) }