MongoDB map reduce 查找 anagrams

MongoDB map reduce find anagrams

我对 mongodb 有疑问。我必须编写一些 js 代码才能在我的 collection 列表中查找字谜。 collection结构如下:

{_id:值,导入:字谜}

下面的代码实际上完成了它的工作 - 它找到了字谜,但我必须使用 map reduce 方式来完成它。 我曾多次尝试将此代码重写为 map reduce,但我没有成功。我知道这个概念,我试过这样做:

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

您可以map-reduce如下:

  • map 函数应该 emit 排序的顺序字符串为 key 和一个 单词数组 value.

代码:

var map = function(){
    var alphabetical = this.import.split("").sort().join("");
    emit(alphabetical,{"words":[this.import]})
}
  • reduce函数,对于每个键和一组单词,只需 累积单词和 returns 它们。

代码:

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" ] } }