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

Ссылка скопирована
11 января 2026 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         })     } });

... 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]; $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 не будет опубликован. Обязательные поля помечены *

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