我有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);
}
答案 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" ] } }