Как исправить и предотвратить ошибку дублирующегося ключа в mongodb - PullRequest
0 голосов
/ 01 марта 2019

Я недавно работал над хобби-проектом и столкнулся с проблемой, которую, похоже, не могу понять даже после поиска в Интернете ответа.Я использую Node.js на c9.io с MongoDB.Каждый раз, когда я пытаюсь создать новую запись в базе данных, первая запись работает и проходит нормально, но затем вторая вызывает ошибку.

E11000 Коллекция ошибок повторяющегося ключа: project.tasks index: username_1 dup key: {: null} '

Моя схема:

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);

Мой запрос на сообщение:

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");
      }
   });
});

Есликто-нибудь знает, что я делаю неправильно, или может привести меня к решению, это было бы удивительно, поскольку я застрял на этом некоторое время.

1 Ответ

0 голосов
/ 01 марта 2019

E11000 duplicate key error collection: project.tasks index: username_1 dup key: { : null }

Эта ошибка исходит от Монго (не от Мангуста).Удаление индексов из вашей схемы mongoose не окажет никакого влияния на базовую коллекцию, поэтому теперь вам нужно удалить уникальный индекс на username из вашей коллекции tasks.

Этот индекс, вероятно, был создан предыдущимикод, который мы больше не видим (или, возможно, этим taskSchema.plugin(passportLocalMongoose);), который звучит подозрительно, как то, что нужно для индекса на username).

Если вы подключаетесь к Монго с помощью оболочки,вам нужно запустить db.tasks.getIndexes(), чтобы увидеть этот уникальный индекс имени пользователя, а затем использовать dropIndexCommand, чтобы удалить ошибочный индекс.

См. E11000 дубликат индекса ошибки ключа вmongodb mongoose для более подробной информации о взаимодействии mongoose & mongo.

...