MongoDB错误代码11000和11001之间的区别

Pri*_*orn 23 mongodb

根据这个高度不完整的清单http://www.mongodb.org/about/contributors/error-codes/,它们都与重复密钥相关.但我无法得到11001错误.以下所有都引发了11000错误:

  • 插入_id已存在的文档
  • 插入具有重复字段的文档,其中字段具有复合唯一索引
  • 用所述复合唯一索引更新文档

因此,这完全违背了链接页面,其中11000表示_id更新(而不是插入)将发生11001.

所以我的问题是:11001何时发生?

Der*_*ick 28

11001GitHub上的2.5/2.6分支中不存在该代码,因此如果您尝试的是2.5版本,则无法创建它.我确实看过代码,但我找不到任何11001直接显示代码的路径.

以下几行将显示代码11001:

db.so.drop();
db.so.insert( { foo: 5 } );
db.so.ensureIndex( { foo: 1 }, { unique: true } );
db.so.insert( { foo: 6 } );
Run Code Online (Sandbox Code Playgroud)

预期的11000:

db.so.insert( { foo: 5 } );
E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }
Run Code Online (Sandbox Code Playgroud)

现在达到11001:

db.so.insert( { foo: 6 } );
db.so.update( { foo: 6 }, { $set: { foo: 5 } } );
E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }
Run Code Online (Sandbox Code Playgroud)

仍然是原始的11000,但是:

db.getPrevError();
{
    "err" : "E11000 duplicate key error index: test.so.$foo_1  dup key: { : 5.0 }",
    "code" : 11001,
    "n" : 0,
    "nPrev" : 1,
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

原始的文本错误消息显示E11000是一个错误:https://jira.mongodb.org/browse/SERVER-5978