Why Does Upsert a Record Using Update_One Raise Valueerror?

Why Does Upsert a Record Using Update_One Raise Valueerror?

I want to add a record to the collection if the key doesn't already exist. I understand [MongoDB][1] offers the upsertfor this so I did a

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

This seems to work.

However in the Pymongo documentation it says that update is deprecated and use to update_one().

But:

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

Gives:

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

I don't really understand why update_one is different and why I need to use a $ operator. Can anyone help?

2 Answers

This is because you didn't specify any update operator. For example to $set the id value use:

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

Note that in the Mongo shell, this will simply replace the document with the new document.

0

Use replace_one() instead of update_one(). the 3rd parameter of replace_one() is upsert, too.

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

My personal opinion is this implementation of update_one() is inconsistent with the behaviour of MongoDB client. The upsert option in update_one() is actually meaningless. But the developers of pyMongo may just want to use this to distinguish update_one() and replace_one().

2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

James H. Sterling
Author

James H. Sterling

James Sterling reports on renewable energy developments, climate policy, ecological conservation, and green tech innovations around the globe.