【发布时间】:2013-11-07 22:54:21
【问题描述】:
问题
我有一个包含 _id 和 Answers 集合的文档我正在尝试编写一个 map-reduce 函数来汇总每个 id 的答案总分。
文档
/* 0 */
{
"_id" : ObjectId("527b6ba88d251d58a18f3f0a"),
"Answers" : [{
"Score" : 2
}, {
"Score" : 0
}, {
"Score" : 2
}, {
"Score" : 2
}]
}
这是 Map-Reduce,我认为阅读文档是正确的
地图
function() {
this.Answers.forEach(function(val)
{
emit(this._id, val.Score);
});
}
也试过了
function() {
for (var i = 0; i < this.Answers; i++)
{
emit(this._id, this.Answers[i].Score);
}
}
减少
function(key, values)
{
return Array.sum(values);
}
我没有收到任何信息,但它似乎正在处理它需要 2-5 秒才能返回。我想我对 map-reduce 不太了解。
我也在使用 MongoVUE 访问 MongoDB。
编辑
我刚刚通过控制台运行了我的 map reduce 并得到了这个输出
{
"results" : [ ],
"timeMillis" : 2506,
"counts" : {
"input" : 1655,
"emit" : 0,
"reduce" : 0,
"output" : 0
},
"ok" : 1,
}
所以我猜是我的地图函数不正确,因为没有发出任何内容。
编辑 2
使用 mongovue 的输出更新文档
【问题讨论】:
-
我正在尝试学习 map-reduce,所以我将其用作我的测试数据。我知道聚合框架通常可能更适合。
-
它根本不发射,我同意它应该是,我只能认为你的架构不是你想象的那样,虽然第二段代码有语法错误,但应该是:
for (var i = 0; i < this.Answers.length; i++) -
我已经更新了从集合的 mongoview 文本视图中剪切和粘贴的文档。
-
你能试试 for 循环的第二个版本,但我声明的改变是?
-
这就是问题所在:S 显然已经看得太久了。作为答案