Python 更新_one()中的pymongo中出现重复密钥错误

Python 更新_one()中的pymongo中出现重复密钥错误,python,mongodb,pymongo,Python,Mongodb,Pymongo,这里我使用pymongo的update_one(),upsert=True 预期的结果是,如果条目已经存在,它应该合并。 但此命令会导致重复密钥错误。 逻辑上,“uniqueId”和“_id”是主键。但是我没有手动设置任何东西,所以只有_id是 db.alerts.update_one({"uniqueId":doc['uniqueId']},{"$set":doc,"$max":statusDict,"$min":{"_id":newId}},upsert=True) 错误: E11000

这里我使用pymongo的update_one(),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" }
更新_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字段

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

在update_one中,我们可以更改或添加除主键以外的属性,主键由dafault'_id'指定

在我的案例中,我用_id和uniqueId交换了用法。代码起作用了

对于简单的示例,只需将两者都替换为do

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


您必须在语义上更改使用这两个字段。或者您可以更改默认主键

str
cast有什么用?@D.SM实际上它不是必需的。但是无论如何,它没有任何效果。如果不需要,就把它拿出来。比较会考虑类型。@D.SM谢谢。我把它拿出来了。错误persistokay,接下来减少您的示例,使其包括插入数据和执行更新的代码,但更新失败。