Search code examples
pythonmongodbmongodb-querypymongo

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 offers the upsert for 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?


Solution

  • 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.