Использование updateMany с $ pull для массива в документе приводит к ошибке дублированного ключа MongoError 11000 для уникального индекса - PullRequest
1 голос
/ 27 февраля 2020

Я пытался выяснить, почему я получаю следующую ошибку:

MongoError: E11000 Коллекция дубликатов ошибок ключа: db_test.contentcomments index: comments.guid_1 dup ключ: {comments.guid : null}

при этом:

ContentComment.updateMany(
    {},
    {
      $pull: { comments: { userId: userIdToDelete } }
    })

Модель ContentComment:

const Comment = new Schema({
  guid: {
    type: String,
    unique: true,
    required: true
  },
  userId: {
    type: String,
    required: true,
    unique: false,
    index: true
  },
  comment: String,
  timestamp: {
    type: Date,
    default: new Date()
  }
});

const ContentComment = new Schema({
  contentGuid: {
    type: String,
    required: true,
    unique: true,
    index: true
  },
  comments: [Comment],
  counter: {
    type: Number,
    default: 0,
  }
});

Глядя на коллекцию в Robo3T, я вижу, что Есть четыре индекса:

{
    "_id" : 1
}
{
    "contentGuid" : 1
}
{
    "comments.guid" : 1
}

и

{
    "comments.userId" : 1
}

Для contentGuid и guid проверяется поле «уникальный».

An пример документа:

{
    "_id" : ObjectId("5e1c86ba03ca187cb10456e3"),
    "contentGuid" : "295582c2-a710-40ee-893a-907921dd6fcd",
    "__v" : 0,
    "comments" : [ 
        {
            "timestamp" : ISODate("2020-01-13T15:03:25.266Z"),
            "_id" : ObjectId("5e1c86bd97adbe23d00a7cs0"),
            "userId" : "f8da5e7d-8e92-4a3c-9765-f69af8bs1s81",
            "comment" : "Test",
            "guid" : "e700c572-85b7-42fc-8c9d-4d43esd322de"
        }
    ],
    "counter" : 1
}

Я не пытаюсь вставить какие-либо документы, как вы можете видеть. Я попытался использовать update с multi: true вместо этого, но получил ту же ошибку. Я также пытался получить все документы, используя find({}), а затем перебирать документы с forEach, используя $set, чтобы дать ему «отфильтрованный вручную» новый массив комментариев, но я всегда получаю ту же ошибку.

Кроме того, я почти уверен, что синтаксис должен быть в порядке, потому что я успешно запустил его для другой коллекции! И я проверил все направляющие - ни один из них не одинаков.

Кто-нибудь видит что-то, что я делаю неправильно или знает, как решить эту проблему? Заранее спасибо!

1 Ответ

0 голосов
/ 28 февраля 2020

Я сбросил индекс на guid (через robo3t) и теперь он работает. Я заметил, что в модели guid нет флага для index: true. Я не уверен, почему вообще был индекс в базе данных mon go. Может быть, кто-то может это прокомментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...