2015-01-06 29 views
1

我有mongodb問題。我必須寫一些js代碼才能在我的收藏列表中找到anagrams。收集結構如下:MongoDB地圖縮小找到anagrams

{_id:值,進口:字謎}

下面的代碼acrually做的工作 - 它發現字謎但我有使用映射精簡的方式來做到這一點。 我曾多次嘗試將此代碼重寫爲地圖縮小但我沒有管理。我知道這個概念,我試過這樣做:

db.lista.mapReduce(
    mapper, 
    reducer, 
    { 
     out : "result" 
    } 
); 

但沒有結果。代碼應該如何拆分?怎麼做?如何將輸出保存到數據庫? 任何幫助將不勝感激。

var input = db.lista.find().sort({ Import: 1}); 
var anagrams = {}; 

input.forEach(function(word) { 
    var alphabetical = word.Import.split("").sort().join(""); 
    var oryginal = word.Import; 
    var sorted = alphabetical; 

    if (anagrams[sorted] != null) { 
     anagrams[sorted].push(word); 
    } 
    else { 
     anagrams[sorted] = [ word ]; 
    } 
}); 

for (var sorted in anagrams) { 
    var words = anagrams[sorted]; 
    var sep = ","; 
    var out = ""; 
    for (var n in words) { 
     out += sep + words[n]; 
     sep = ""; 
    } 
    print(sorted + ": " + out); 
}  

回答

1

你可以map-reduce如下:

  • map功能應該emit排序順序字符串作爲key和 陣列的話作爲value

代碼:

var map = function(){ 
    var alphabetical = this.import.split("").sort().join(""); 
    emit(alphabetical,{"words":[this.import]}) 
} 
  • reduce功能,每個鍵和一組詞,只是 積累的單詞,並返回它們。

代碼:

var reduce = function(key,value){ 
    var result = {"words":[]}; 
    value.forEach(function(word){ 
    result["words"] = result["words"].concat(word["words"]); 
    }) 
    return result; 
} 

在收集調用map-reduce

db.collection.mapReduce(map,reduce,{out:"s"}); 

從轉儲結果的集合中獲取輸出。

db.s.find()會給你下面的樣本結果。

{ "_id" : "adeippr", "value" : { "words" : [ "prepaid" ] } } 
{ "_id" : "ckor", "value" : { "words" : [ "rock", "cork" ] } } 
{ "_id" : "clo", "value" : { "words" : [ "clo", "loc" ] } } 
+0

非常感謝。它工作正常。你的專業知識幫助了我很多。 – user2980480