MongoDB map减少了查找字谜

时间:2015-01-06 19:03:40

标签: javascript mongodb mapreduce

我有mongodb的问题。我必须编写一些js代码来查找我的集合列表中的字谜。收集结构如下:

{_ id:value,Import:anagram}

下面的代码非常有效 - 它找到了字谜,但我必须使用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);
}    

1 个答案:

答案 0 :(得分: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" ] } }