skip to Main Content

ok so basically im getting this error and i dont know whats causing it

MongoServerError: Plan executor error during findAndModify :: caused by :: E11000 duplicate key error collection: test.profilemodels index: userID_1 dup key: { userID: "776359374783512608" }

i’ve literally tried dropping indexes and it still didnt work. all that works is when i drop my database/collection and i dont wanna have to do that everytime

my schema:

const mongoose = require("mongoose");

const profileSchema = new mongoose.Schema({
  userID: { type: String, require: true, unique: true },
  serverID: { type: String, require: true },
  coins: { type: Number, default: 200 },
  inventory: { type: Object },
  bank: { type: Number },
  bankSpace: { type: Number, default: 10000 },
  bankNotes: { type: Number },
  title: { type: String, default: 'Newbie'},
  badges: { type: String, default: 'None'},
  cPoints: { type: Number}
});

const model = mongoose.model("ProfileModels", profileSchema);

module.exports = model;

the code the error is coming from:

            const cpoints = profileData.cPoints
            if(cpoints < 10000) return message.reply('You don't have enough wins for this title!')

            await profileModel.findOneAndUpdate(
                {
                    userID: message.author.id,
                    title: 'Coinflipper'
                }
            );
            message.reply('Successfully equipped the **Coinflipper** Title!')

im stumped by this error hopefully someone can help

2

Answers


  1. I think, you are not using properly the function findOneAndUpdate(..), https://mongoosejs.com/docs/tutorials/findoneandupdate.html

    Try something like this:

    await profileModel.findOneAndUpdate(
                 { userID: message.author.id}, // filter
                 { title: 'Coinflipper' } // fields to modify
                );
    
    Login or Signup to reply.
  2. As you’ve pointed in your schema, the userID field has to be unique.

    With syntax below, you are telling to mongoose to update FIRST found document with userID that was already used by some other document. It’s beacuse in that case first parameter is ‘update’ part.

    await profileModel.findOneAndUpdate(
      // update part 
       {
           userID: message.author.id,
           title: 'Coinflipper'
       }
    );
    

    So to fix it, you have to
    set some filtration in the first parameter, and in the second one ‘fields to update’. So it will be like

      await profileModel.findOneAndUpdate(
         // filter part
        {
            userID: message.author.id
        },
        // update part 
        {
            title: 'Coinflipper'
        }
    );
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search