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