MongoDB генерирует один и тот же ObjectID для дубликатов документов - PullRequest
0 голосов
/ 19 января 2019

Я новичок в MongoDB и использую Pymongo в ноутбуке Jupyter. При вставке документа в первый раз все работает нормально. При вставке того же документа (повторного запуска той же ячейки jupyter) я получаю «DuplicateKeyError: E11000 дубликат индекса ошибки ключа».

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

Насколько я понимаю, Монго создает OjbectID на основе времени и случайности. Это действует так, как будто ObjectID основан на том, когда был создан мой объект.

class User:
    def __init__(self, email, password, username=None, image_file=None):
        self.email = email
        self.password = password
        self.username = username
        self.image_file = image_file

        self.newUser= f"""{{"email":"{self.email}",
                        "password":"{self.password}", 
                        "username": "{self.username}",
                        "image_file": "{self.image_file}"}}"""
        self.jsonDoc = json.loads(self.newUser)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', 
                      '{self.image_file}')"

jim = User("xx2", "password")
mongo.db.users.insert_one(jim.jsonDoc)

Ожидаемое поведение: Создавать новый документ и уникальный ObjectID каждый раз, когда ячейка перезапускается.

Фактическое поведение: работает при первом запуске ячейки. Ошибки при втором запуске. Если класс пользователя вызывается снова (с той же информацией), он работает.

1 Ответ

0 голосов
/ 19 января 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что вы пытаетесь вставить новый документ со значением a для индексированного ключа (где индексированный ключ помечен как Уникальный), который уже присутствует в одном из документов в MongoDB.

Если вы явно не проиндексировали ни один из ключей, то при вставке необходимо также включить поле «_id» в документ, а поле «_id» должно иметь то же значение, что и ранее вставленный документ..

Пожалуйста, перейдите по ссылкам ниже:

https://docs.mongodb.com/manual/core/index-unique/

https://docs.mongodb.com/manual/indexes/

...