如何修复和防止 mongodb 中的重复键错误
How to fix and prevent duplicate key error in mongodb
我最近一直在做一个业余爱好项目,我遇到了一个我似乎无法弄清楚的问题,即使在网上搜索了答案之后也是如此。我在 c9.io 和 MongoDB 上使用 Node.js。每当我尝试在数据库中创建一个新条目时,第一个条目可以正常运行,但第二个条目会导致错误。
E11000 duplicate key error collection: project.tasks index: username_1 dup key:
{ : 空}'
我的架构:
var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");
var taskSchema = new mongoose.Schema({
task: String,
region: String,
cost: String,
when: String,
isAccepted: Boolean,
author: {
id:{
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
},
tasker: {
id : {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
}
});
taskSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("Task", taskSchema);
我的Post请求:
app.post("/taskers/index/show", function(req, res){
var task = req.body.task;
var newTask = {
task: task.task,
region: task.region,
cost: task.cost,
when: task.when,
isAccepted: false,
author: req.user._id,
tasker: req.user._id
};
console.log("STSOTSOTSOTOOPP");
Task.create(newTask, function(err, newlyCreated){
if(err){
console.log(err);
} else {
console.log(newlyCreated);
res.redirect("/users/index");
}
});
});
如果有人知道我做错了什么或者可以引导我找到解决方案,那将是非常棒的,因为我已经坚持了一段时间。
E11000 duplicate key error collection: project.tasks index: username_1 dup key: { : null }
此错误来自 mongo(而非来自 mongoose)。从 mongoose 模式中删除索引不会对基础集合产生任何影响,因此您现在需要从 tasks
集合中删除 username
上的唯一索引。
这个索引可能是由我们不再看到的以前的代码创建的(或者可能是由taskSchema.plugin(passportLocalMongoose);
创建的——这听起来很可疑,就像那种需要在username
上建立索引的东西) .
如果您使用 shell 连接到 mongo,您应该到 运行 db.tasks.getIndexes()
查看唯一的用户名索引,然后使用 dropIndexCommand
删除有问题的索引。
有关 mongoose 和 mongo 如何交互的更多详细信息,请参阅 E11000 duplicate key error index in mongodb mongoose。
我最近一直在做一个业余爱好项目,我遇到了一个我似乎无法弄清楚的问题,即使在网上搜索了答案之后也是如此。我在 c9.io 和 MongoDB 上使用 Node.js。每当我尝试在数据库中创建一个新条目时,第一个条目可以正常运行,但第二个条目会导致错误。
E11000 duplicate key error collection: project.tasks index: username_1 dup key: { : 空}'
我的架构:
var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");
var taskSchema = new mongoose.Schema({
task: String,
region: String,
cost: String,
when: String,
isAccepted: Boolean,
author: {
id:{
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
},
tasker: {
id : {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
}
});
taskSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("Task", taskSchema);
我的Post请求:
app.post("/taskers/index/show", function(req, res){
var task = req.body.task;
var newTask = {
task: task.task,
region: task.region,
cost: task.cost,
when: task.when,
isAccepted: false,
author: req.user._id,
tasker: req.user._id
};
console.log("STSOTSOTSOTOOPP");
Task.create(newTask, function(err, newlyCreated){
if(err){
console.log(err);
} else {
console.log(newlyCreated);
res.redirect("/users/index");
}
});
});
如果有人知道我做错了什么或者可以引导我找到解决方案,那将是非常棒的,因为我已经坚持了一段时间。
E11000 duplicate key error collection: project.tasks index: username_1 dup key: { : null }
此错误来自 mongo(而非来自 mongoose)。从 mongoose 模式中删除索引不会对基础集合产生任何影响,因此您现在需要从 tasks
集合中删除 username
上的唯一索引。
这个索引可能是由我们不再看到的以前的代码创建的(或者可能是由taskSchema.plugin(passportLocalMongoose);
创建的——这听起来很可疑,就像那种需要在username
上建立索引的东西) .
如果您使用 shell 连接到 mongo,您应该到 运行 db.tasks.getIndexes()
查看唯一的用户名索引,然后使用 dropIndexCommand
删除有问题的索引。
有关 mongoose 和 mongo 如何交互的更多详细信息,请参阅 E11000 duplicate key error index in mongodb mongoose。