为什么使用update_one引发记录会引发ValueError?

joh*_*y B 31 python mongodb pymongo mongodb-query

如果密钥尚不存在,我想在集合中添加记录.我理解[MongoDB] [1]提供了upsert这个,所以我做了一个

db.collection.update({"_id":"key1"},{"_id":"key1"},True) 
Run Code Online (Sandbox Code Playgroud)

这似乎有效.

但是在Pymongo文档中,它表示不推荐使用更新并使用update_one().

但:

db.collection.update_one({"_id":"key1"},{"_id":"key1"},True)
Run Code Online (Sandbox Code Playgroud)

得到:

raise ValueError('update only works with $ operators')
ValueError: update only works with $ operators
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么update_one不同以及为什么我需要使用$运算符.有人可以帮忙吗?

sty*_*ane 39

这是因为您没有指定任何更新运算符.例如,为了$setid值使用:

db.collection.update_one({"_id":"key1"}, {"$set": {"id":"key1"}}, upsert=True)
Run Code Online (Sandbox Code Playgroud)

请注意,在Mongo shell中,这只是用新文档替换文档.


Geo*_*Lei 15

replace_one()而不是update_one().的第三个参数replace_one()upsert,太.

db.collection.replace_one({"_id": "key1"}, {"_id": "key1"}, True) 
Run Code Online (Sandbox Code Playgroud)

我个人认为这种实现update_one()与MongoDB客户端的行为不一致.该upsert选件update_one()实际上是毫无意义的.但pyMongo的开发人员可能只想用它来区分update_one()replace_one().

  • 他们是不同的。Replace_one总是替换数据,update_one可以更新记录的某些字段。 (3认同)
  • 谢谢你,你的回答让我很头疼。从文档中不清楚,与“update_one”相同的调用是无效的,而“replace_one”是无效的。顺便说一句,也适用于 C++ 驱动程序。 (2认同)