gpt4 book ai didi

javascript - Mongodb MapReduce 连接字符串?

转载 作者:可可西里 更新时间:2023-11-01 09:59:53 25 4
gpt4 key购买 nike

我见过的所有 MongoDB MapReduce 示例都涉及计数/加法。我需要组合字符串,看起来 MapReduce 是完成这项工作的最佳工具。我有一个这种格式的大型 MongoDB 集合:

{name: userone, type: typeone}
{name: usertwo, type: typetwo}
{name: userthree, type: typeone}

每个名称只有一种类型,但名称不一定唯一。我想最终得到一个集合,它列出了特定类型的所有名称,可以是逗号分隔的列表,也可以是数组,如下所示:

 {type: typeone, names: userone, usertwo}
{type: typetwo, names: userthree}

我试图使用 MapReduce 来完成此任务。当一种类型只有一个用户时,我的功能可以正常工作。但是,当有多个用户时,'undefined' 存储在 names 字段中。

我不是很擅长 Javascript,而且我还在学习 MongoDB,所以它可能是一个简单的数据类型或范围错误。

这是我的 map 和 reduce 函数。他们怎么了?

map = function() {
emit(this.user,{type:this.type});
}

reduce = function(key, values) {
var all="";
for(var i in values) {
all+=values[i]['type']+",";
}
return all;
}

最佳答案

在我看来,您正在尝试通过类型进行分组。如果是这样,您应该首先发出类型。从那里开始,它与您的代码几乎相同,但我冒昧地对它进行了一些清理。

请注意,reduce 函数可能会在较小的组中被多次调用。因此,如果您在分片环境中使用您的代码,您可能会得到额外的尾随逗号。参见 Reduce Function获取更多信息。

map :

m = function(){ emit(this.type, {names:this.name}); }

减少:

r = function(key, values){
var all = [];
values.forEach(function(x){
all.push(x.names)
})
return {"names": all.join(", ")};
}

用法:

res = db.users.mapReduce(m,r); db[res.result].find()

备用:

根据 OP 请求,这是一个返回名称数组而不是逗号分隔列表字符串的版本:

m = function () {
emit(this.type, {names:this.name});
}

r = function (key, values) {
var all = [];
values.forEach(function (x) {all.push(x.names);});
return {type:key, names:all};
}

f = function (w, r) {
r.names = r.names[0];
return r
}

res = db.users.mapReduce(m,r, {finalize:f}); db[res.result].find()

干杯!

关于javascript - Mongodb MapReduce 连接字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2975904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com