Ошибка повторяющегося ключа в pymon go в update_one () - PullRequest
0 голосов
/ 25 мая 2020

Здесь я использую update_one () pymon go с upsert = True.

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

db.alerts.update_one({"uniqueId":doc['uniqueId']},{"$set":doc,"$max":statusDict,"$min":{"_id":newId}},upsert=True)

Ошибка:

E11000 duplicate key error collection: alerts.alerts index: _id_ dup key: { _id: "336" }

Это не ожидается для update_one (), верно?

Упрощено Пример для случая

from pymongo import MongoClient

db = MongoClient()

collection = db.tests.tests
collection.insert_one({"name":"tom","unique":1,"_id":1})
collection.update_one({"unique":1},{"$set":{"name":"jerry"},"$min":{"_id":0}})

Это приводит к ошибке _id field

pymongo.errors.WriteError: Performing an update on the path '_id' would modify the immutable field '_id'

1 Ответ

0 голосов
/ 25 мая 2020

В update_one мы можем изменить или добавить атрибуты, отличные от первичного ключа, который по умолчанию '_id'.

Я поменял местами использования для _id и uniqueId в моем случае. И код сработал.

Для простого примера просто поменяйте местами оба с помощью do

collection.update_one({"_id":1},{"$set":{"name":"jerry"},"$min":{"unique":0}})

Вам придется семантически изменить использование обоих полей. Или вы можете изменить первичный ключ по умолчанию.

...