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

Why does upsert a record using update_one raise ValueError?

如果键不存在,我想向集合中添加一条记录。我知道 [MongoDB][1] 为此提供 upsert 所以我做了

db.collection.update({"_id":"key1"},{"_id":"key1"},True) 

这似乎有效。

但是在 Pymongo documentation 中它说更新已被弃用并用于 update_one()

但是:

db.collection.update_one({"_id":"key1"},{"_id":"key1"},True)

给出:

raise ValueError('update only works with $ operators')
ValueError: update only works with $ operators

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

这是因为您没有指定任何 update operator。 例如对 $setid 值使用:

db.collection.update_one({"_id":"key1"}, {"$set": {"id":"key1"}}, upsert=True)

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

使用 replace_one() 而不是 update_one()replace_one()的第三个参数也是upsert

db.collection.replace_one({"_id": "key1"}, {"_id": "key1"}, True) 

我个人认为 update_one() 的这种实现与 MongoDB 客户端的行为不一致。 update_one()中的upsert选项其实是没有意义的。但是pyMongo的开发者可能只是想用这个来区分update_one()replace_one().