Ошибка повторяющегося ключа в монго Sharded Cluster - PullRequest
0 голосов
/ 03 февраля 2019

Я сталкиваюсь с ошибкой дублирования ключа в Mongo Sharded Cluster (MSC), которая не возникает при работе с набором реплики Mongo.

У меня есть простая операция в клиентском приложении:

// pseudocode - email is unique key
subscriber = db.newsletter.find({email: "john@smith.com"})
if (subscriber == null) {
  db.newsletter.insert({email: "john@smith.com", name: "John"})
} else {
  db.newsletter.update({email: "john@smith.com"}, {name: "John"})
}

Я не включил его в приведенный выше код, но мне нужно получить _id документа, поэтому использование upsert не вариант.

Ошибка : Если вышеуказанный процесс выполняется дважды для одного и того же и нового электронного письма, это приведет к ошибке дублированного ключа.Вторая итерация не сможет найти подписчика, поэтому она будет пытаться вставить, несмотря на то, что документ уже существует в коллекции.

Насколько я знаю, запуск единственного экземпляра вышеупомянутого клиента не должен вызывать ошибку дублирующегося ключа, но этоделает.

1 Ответ

0 голосов
/ 12 февраля 2019

Это будет работа команды findAndModify или метод findOneAndUpdate .

Существует флаг upsert, который создаст документ, еслиего не существуетВам также потребуется использовать флаг new, чтобы вернуть новый документ, если он создан.

...