#mongodb #mongoose #mongodb-query #mongodb-indexes
Вопрос:
Я пытаюсь вставить несколько документов в свою коллекцию MongoDB, но что бы я ни делал, я получаю повторяющуюся ошибку. Я убедился, что дубликатов быть не должно, удалив всю коллекцию.
Я попробовал это с помощью .insertMany(), .save(), .create() — ни один из них не работает. Хотя документы вставляются, я все равно получаю повторяющуюся ошибку 11000.
Моя функция для вставки документов:
Words.prototype.addManyGeneralWordsEN = async function(words) {
await generalWordEN.create(words).then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err.code)
})
}
// add words to database
await this.addManyGeneralWordsEN(wordsToAdd)
Моя схема:
const generalWordENSchema = new mongoose.Schema(
{
german: {
type: String,
required: true
},
english: {
type: String,
required: true
},
partOfSpeech: {
required: true,
type: String
},
example: {
default: null,
type: String,
},
defintion: {
default: null,
type: String,
},
image: {
default: null,
type: String,
},
audio: {
default: null,
type: String,
},
level: {
default: null,
type: Number,
},
}
)
generalWordENSchema.index({ german: 1, english: 1, partOfSpeech: 1}, { unique: true })
module.exports = generalWordENSchema
Мои примерные данные:
[
{
"english": "clothes",
"german": "Kleidung",
"partOfSpeech": "noun",
"example": "My wife's wardrobe is filled with beautiful clothes.",
"definition": "",
"image": "",
"audio": "",
"level": ""
},
{
"english": "men's clothing",
"german": "Herrenbekleidung",
"partOfSpeech": "noun",
"example": "Men's clothing is on the second floor.",
"definition": "",
"image": "",
"audio": "",
"level": ""
}
]
Комментарии:
1. У вас есть опечатка в объявлении схемы. Там сказано
defintion
вместоdefinition
этого .
Ответ №1:
Проблема, вероятно, в этой строке
generalWordENSchema.index({ german: 1, english: 1, partOfSpeech: 1}, { unique: true })
Вы создали индекс для коллекции и использовали partOfSpeech
как unique
, но у вас есть два документа с одинаковым значением noun
.
Это должно сработать, если вы измените его на:
generalWordENSchema.index({ german: 1, english: 1 }, { unique: true });
У вас также есть опечатка в объявлении схемы, которая может вызвать различные проблемы. Вы ввели определение вместо определения.
Комментарии:
1. Спасибо за ваш ответ! Как создать индекс, в котором комбинация этих трех значений уникальна, а не только одно поле?
2. Почему это должно
generalWordENSchema.index({ german: 1, english: 1, partOfSpeech: 1}, { unique: true })
быть неправильно? Это правильный синтаксис для комбинаций нескольких значений уникального индекса в соответствии с документами MongoDB. Я не понимаю, почему это приводит меня к такой ошибке. Коллекция совершенно новая, и в моем JSON нет повторяющихся объектов. Что также странно, так это то, что все объекты по-прежнему сохраняются в базе данных, даже если это приводит к этой ошибке.3. Выдает ли это ошибку при удалении
partOfSpeech
? Я проверил документы, и было бы неплохо использовать их все три для составного индекса.4. Тогда я думаю, что нам нужно предоставить больше информации. Может быть, отпечатки ошибок?