Почему возникает ошибка "E11000 duplicate key error collection: prj.users index: email_1 dup key: { email: null }?
При отправке запроса происходит ошибка "MongoServerError: 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 - значит если будут два одинаковых логина - возникнет ошибка.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Ошибка "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 и коллекциями, имеющими уникальные индексы.