我有重复密钥的问题。很长一段时间找不到答案。请帮助我解决此问题或解释为什么我得到重复的密钥错误。
Trace: { [MongoError: E11000 duplicate key error collection: project.monitor index: _id_ dup key: { : 24392490 }]
name: 'MongoError',
message: 'E11000 duplicate key error collection: project.monitor index: _id_ dup key: { : 24392490 }',
driver: true,
index: 0,
code: 11000,
errmsg: 'E11000 duplicate key error collection: project.monitor index: _id_ dup key: { : 24392490 }' }
at /home/project/app/lib/monitor.js:67:12
at callback (/home/project/app/node_modules/mongoose/lib/query.js:2029:9)
at Immediate.<anonymous> (/home/project/app/node_modules/kareem/index.js:160:11)
at Immediate._onImmediate (/home/project/app/node_modules/mquery/lib/utils.js:137:16)
at processImmediate [as _immediateCallback] (timers.js:368:17)
但是在监视器中,我使用upsert,所以为什么会出现重复错误?
monitor.js:62-70
监控架构
var monitorSchema = db.Schema({
_id : {type: Number, default: utils.minute},
maxTicks : {type: Number, default: 0},
ticks : {type: Number, default: 0},
memory : {type: Number, default: 0},
cpu : {type: Number, default: 0},
reboot : {type: Number, default: 0},
streams : db.Schema.Types.Mixed
}, {
collection: 'monitor',
strict: false
});
指数
monitorSchema.index({_id: -1});
Monitor = db.model('Monitor', monitorSchema);
并增加财产
exports.increase = function (property, incr) {
var update = {};
update[property] = utils.parseRound(incr) || 1;
Monitor.update({_id: utils.minute()}, {$inc: update}, {upsert: true}, function (err) {
if (err) {
console.trace(err);
}
});
};
utils.js
exports.minute = function () {
return Math.round(Date.now() / 60000);
};
exports.parseRound = function (num, round) {
if (isNaN(num)) return 0;
return Number(parseFloat(Number(num)).toFixed(round));
};
导致插入文档的ups不是完全原子的操作。将ups视为执行以下离散步骤:
因此,第2步和第3步都是原子操作,但是在第1步之后可能会发生另一个upsert,因此您的代码需要检查重复的键错误,然后再次尝试upsert。到那时,您知道_id
存在的文档,因此它将始终成功。
例如:
var minute = utils.minute();
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true }, function(err) {
if (err) {
if (err.code === 11000) {
// Another upsert occurred during the upsert, try again. You could omit the
// upsert option here if you don't ever delete docs while this is running.
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true },
function(err) {
if (err) {
console.trace(err);
}
});
}
else {
console.trace(err);
}
}
});
有关相关文档,请参见此处。
您可能仍然想知道,如果插入是原子的,为什么会发生这种情况,但这意味着插入的文档在完全写入之前不会进行任何更新,而不是不会_id
出现具有相同文档的其他插入。
另外,您不需要手动创建索引,_id
因为所有MongoDB集合都具有唯一的索引_id
。因此,您可以删除以下行:
monitorSchema.index({_id: -1}); // Not needed
问题内容: 为什么会出现此重复错误- ? 提供的所有字段都不为空。 架构: 发布: 错误: 创建新用户时出错:WriteError({:“ 11000,” index“:0,” errmsg“:” insertDocument ::由:: 11000 E11000重复键错误导致:iotdb.users。$ name_1 dup key:{: null}“,” op“:{”用户名“:” tealou
问题内容: 我正在使用Restify和Mongoose创建一个API ,而这两个都是我的新手。我似乎无法找出正确的方法来处理Mongoose / Node中的错误。 到目前为止,我正在尝试执行以下操作: 我正在尝试为此调用GET(针对不存在的用户)。而不是发送回简单的错误消息,而是导致整个节点应用程序失败。我对return next(err)的用户以及应该怎么做感到困惑。 任何帮助是极大的赞赏。
问题内容: 如果猫鼬无法连接到数据库,如何设置错误处理的回调? 我知道 但是是否有类似的东西 ? 问题答案: 连接后,您可以在回调中获取错误:
问题内容: 我有一个像这样的MongoDb模式 我正在尝试创建一个新用户, 这是使用mongoose ODM在NodeJs中完成的, 这是用于创建的代码: 为了创建新用户,我给属性和值如下: 我收到这样的错误: 我知道这个错误是因为用户名重复,但是 我没有为用户名设置唯一约束。每当添加新行时,我只需要电子邮件是唯一的,用户名就可以重复。 如何实现? 问题答案: @ManseUK可能是正确的,看起来
问题内容: 我试图用mongoose在mongodb中保存一个新文档,但是即使我提供电子邮件,passwordHash和用户名,我也能得到。 这是用户架构。 这就是我创建和保存用户对象的方式。 那么为什么猫鼬会返回验证错误,我不能用作临时值吗? 问题答案: 回应您的最后评论。 您正确的认为null是一个值类型,但是null类型是一种告诉解释器它 没有value的方法 。因此,必须将这些值设置为任何
问题内容: 我正在从npm 使用此架构: 如果我尝试保存已经存在于db中的电子邮件,则如果省略该字段,我希望得到一个类似的电子邮件。但是事实并非如此,我得到了。 这不是验证错误(即使我删除了unique:true也会发生)。 知道为什么吗? 问题答案: 我更喜欢将其放在路径验证机制中,例如 然后,它将被包装,并在您调用或时作为第一个参数返回。