Почему возникает ошибка "E11000 duplicate key error collection: prj.users index: email_1 dup key: { email: null }?

Ссылка скопирована
1 ответ

При отправке запроса происходит ошибка "MongoServerError: E11000 duplicate key error collection: prj.users index: email_1 dup key: { email: null }".
Как ее можно решить?

Почему возникает ошибка "E11000 duplicate key error collection: prj.users index: email_1 dup key: { email: null }?

Код:

...  const {Schema, model} = require('mongoose');  const userSchema = new Schema({     name: {         type: String,         required: true     },     surname: {         type: String,         required: true     },     login: {         type: String,         unique: true,         required: true     },     hashedPassword: {         type: String,         required: true     },     role: {         type: String,         required: true     },     classObj: {         type: String     },     books: [{ type: Schema.Types.ObjectId, ref: 'books' }] });  const User = model('users', userSchema);   app.post('/auth/reg', async (req, res) => {     try {         const { name } = req.body;         const { surname } = req.body;         const { login } = req.body;         const { password } = req.body;         const { role } = req.body;         const { classObj } = req.body || '';         // const { books } = req.body;          const hashedPwd = await bcrypt.hash(password, 8);          const userr = new User({             name: name,             surname: surname,             login: login,             hashedPassword: hashedPwd,             role: role,             classObj: classObj,             books: []         });          await userr.save();         return res.status(200).json({             msg: "Пользователь успешно зарегистрирован"         });     } catch (e) {         console.log(e);         return res.status(500).json({             msg: "Не удалось добавить пользователя",             error: e.message         })     } });

Дополнительно:

вы получаете данные из пост запроса и сразу сохраняете их, без проверки? Но у вас в поле login указан атрибут unique: true - значит если будут два одинаковых логина - возникнет ошибка.

  • Антон Горецкий, писал вообще разные логины, не помогло. Пробовал убирать unique, через Compass добавляется, через запрос такая же ошибка
  • вам не unique надо убирать, а перед сохранением проверять существует ли уже такой ключ в БД. В ошибке точно указана причина ошибки: duplicate key error collection, только не понятно почему речь идет про поле email, которого в вашей схеме не видно.
  • Антон Горецкий, меня тоже email смущает) спасибо за помощь
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Ошибка "E11000 duplicate key error collection: prj.users index: email_1 dup key: { email: null }" возникает в MongoDB при попытке вставить документ с дублирующимся значением ключа в коллекцию, которая имеет уникальный индекс на поле email. В данном случае, ошибка указывает на то, что вы пытаетесь вставить документ с полем email, которое имеет значение null, хотя в коллекции уже есть документ с таким же значением.

    Чтобы решить эту проблему, вам необходимо убедиться, что все документы, которые вы вставляете в коллекцию, имеют уникальные значения для поля email. Если у вас есть документы с полем email, у которого значение равно null, вам следует либо удалить эти документы, либо обновить поле email на уникальное значение.

    Пример кода на PHP для вставки документа с проверкой на уникальность email:

     $email];
    $options = [];
    $query = new MongoDB\Driver\Query($filter, $options);
    $cursor = $manager->executeQuery('prj.users', $query);
     
    if ($cursor->toArray() == []) {
        $document = ['email' => $email, 'name' => 'John Doe'];
        $bulk->insert($document);
        $result = $manager->executeBulkWrite('prj.users', $bulk);
        echo "Document inserted successfully.";
    } else {
        echo "Email already exists in the collection.";
    }
    ?>

    Этот код проверяет, существует ли документ с таким же email в коллекции. Если документ не существует, то происходит вставка нового документа. Если же документ уже существует, выводится сообщение о том, что email уже присутствует в коллекции.

    Таким образом, следуя подобному подходу, вы сможете избежать ошибки "E11000 duplicate key error collection" при работе с MongoDB и коллекциями, имеющими уникальные индексы.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно