Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upsert and Multi flag in pymongo

I am working on pymongo and this is my document:

{
   "_id": ObjectId("51211b57f07ddaa377000000"),
   "assignments": {
     "0": {
       "0": {
         "_id": ObjectId("5120dd7400a4453d58a0d0ec") 
      },
       "1": {
         "_id": ObjectId("5120dd8e00a4453d58a0d0ed") 
      },
       "2": {
         "_id": ObjectId("5120ddad00a4453d58a0d0ee") 
      } 
    } 
  },
   "password": "my_passwd",
   "username": "john" 
}

I would like to unset the "assignment" property of all such docs. I was able to achieve this on the mongo shell by doing:

db.users.update({}, {$unset: {"assignments": 1}}, false, true)

i.e., I passed the upsert and multi flag as the last two parameters to the update function function on users collection. However I did this with pymongo:

db.users.update({}, {"$unset": {"assignments": 1}}, False, True)

But the python interpreter threw an error as follows:

File "notes/assignment.py", line 34, in <module>
    db.users.update({}, {"$unset": {"assignments": 1}}, False, True)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 481, in update
    check_keys, self.__uuid_subtype), safe)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 852, in _send_message
    rv = self.__check_response_to_last_error(response)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 795, in __check_response_to_last_error
    raise OperationFailure(details["err"], details["code"])
pymongo.errors.OperationFailure: Modifiers and non-modifiers cannot be mixed

Where am I going wrong?

like image 786
swaroopsm Avatar asked Feb 17 '13 19:02

swaroopsm


People also ask

What does Upsert do in MongoDB?

In MongoDB, upsert is a method that is used to insert and update the value in any operation. In other words, the MongoDB upsert method is a combination of insert and update (insert + update = upsert). By default, the upsert method's value is always false.

What does PyMongo Find_one return?

The most basic type of query that can be performed in MongoDB is find_one() . This method returns a single document matching a query (or None if there are no matches).

Is PyMongo ORM?

1. PyMongo. The PyMongo MongoDB ORM for Python is a native and highly popular Python driver for MongoDB. It supports MongoDB versions MongoDB 2.6, 3.0, 3.2, 3.4, 3.6, 4.0, 4.2, 4.4, and 5.0.


1 Answers

The problem is that the two flags you are passing in aren't upsert and multi. Based on the documentation of PyMongo's Collection.update (found here), it looks like you might be passing in values for the upsert and manipulate options, although I am not certain.

All you have to do to solve this is use one of Python's most awesome features: named arguments. By specifying which options you are passing to update, you add clarity to your code in addition to making sure accidents like this don't happen.

In this case, we want to pass the options upsert=False and multi=True.

db.users.update({}, { "$unset": { "assignments": 1 } }, upsert=False, multi=True)
like image 157
James Brewer Avatar answered Sep 18 '22 13:09

James Brewer