MongoDB:在 Map Reduce 期间收集 E11000 重复键错误

标签 mongodb mapreduce mongodb-query aggregation-framework

我想计算数组的所有最后一个元素。该数组包含整数,可能为空。

以下 Map Reduce 示例在大型集合(> 1000 万个条目)上崩溃并出现重复键错误:

var map = function() {
    if(this.path.length > 0) {
        emit(this.path.slice(-1)[0], 1);
    }
};
var reduce = function(id, values) {
    var sum = 0;
    values.forEach(function(value) {
        sum += value;
    });
    return sum;
};
db.input.mapReduce(map, reduce, {out: 'output'})

Mongo 版本是 3.2,带有 WT 引擎。该示例在较小的集合(例如 ~500k 条目)上运行良好

完整错误:

2016-02-25T19:20:09.078+0100 E QUERY    [thread1] Error: map reduce failed:{
    "ok" : 0,
    "errmsg" : "E11000 duplicate key error collection: my_db.tmp.mr.input_10 index: _id_ dup key: { : 174.0 }",
    "code" : 11000
} :
_getErrorWithCode@src/mongo/shell/utils.js:23:13
DBCollection.prototype.mapReduce@src/mongo/shell/collection.js:1300:1
@(shell):1:1

最佳答案

mapReduce 示例失败的原因是数组的最后一个元素可以是整数或数组本身。我不确定错误消息试图告诉我什么。

感谢 Blakes Seven,我找到了原因,他提出了聚合管道。它不仅速度更快、代码更少,而且还会崩溃并出现清晰易懂的错误:

assert: command failed: {
    "ok" : 0,
    "errmsg" : "insert for $out failed: { connectionId: 599, err: \"can't use an array for _id\", code: 2, n: 0, ok: 1.0 }",
    "code" : 16996
} : aggregate failed

关于MongoDB:在 Map Reduce 期间收集 E11000 重复键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35635610/

相关文章:

mongodb - 在MongoDB的查询中, "center" "radius"是什么单位?

java - 在同一项目中切换 MongoDB 和 JPA (Postgres)

Java & MongoDB 查询 ISODate 问题

ruby - 如何将数据发布到 Volt 应用程序?

c# - 在 C# dockerfile 中运行可执行文件

Hadoop Cascading - 创建一个源,两个汇的流

java - 映射器函数中的静态变量值未更改

hadoop - Hadoop按键分组错误

javascript - 如何将查询结果保存在 Mongo JS 的变量中并用它更新文档?

node.js - Mongo $ min和$ max,或并行排序