Ошибка дублирования, даже если коллекция пуста

#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. Тогда я думаю, что нам нужно предоставить больше информации. Может быть, отпечатки ошибок?