2015-01-06 27 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