I just blew an hour with a silly mistake (or two!)
I have an MongoDB collection with a bunch of documents I'm accessing via pymongo. The docs have data in an array. In the latest doc, I want to append an element to the array. So, I use $push, this is normal. Finding the right doc to modify, this was harder.
Below is the terminal session where I did this. I made several mistakes, I hope you find it useful to see them.
The biggest one is that THERE IS NO findAndModify in pymongo. It's called 'find_and_modify()'. I kept getting the dreaded error:
TypeError: 'Collection' object is not callable. If you meant to call the 'findAndUpdate' method on a 'Database' object it is failing because no such method exists.
This was reasonable - there is no such function.
Other mistakes below might be useful, too, in that I think they're probably common.
[esm@myboxname:scripts]$ python Python 2.6.6 (r266:84292, Jul 20 2011, 10:22:43) [GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from pymongo import Connetion >>> c = Connection('myboxname', 40000) >>> mm = c.mymassivecollection >>> ret = mm.delme2.insert({'metrictypeid': 20, 'start':1000, 'vals':[3,4]}); >>> ret ObjectId('5150c9bd64524c04169fd612') >>> mm.delme2.insert({'metrictypeid': 20, 'start':1010, 'vals':[3,4]}); ObjectId('5150c9cd64524c04169fd613') >>> mm.delme2.insert({'metrictypeid': 20, 'start':1020, 'vals':[3,4]}); ObjectId('5150c9d264524c04169fd614') >>> mm.delme2.insert({'metrictypeid': 20, 'start':1030, 'vals':[3,4]}); ObjectId('5150c9d764524c04169fd615') >>> mm.delme2.insert({'metrictypeid': 10, 'start':1030, 'vals':[3,4]}); ObjectId('5150c9dd64524c04169fd616') >>> mm.delme2.find()>>> [x for x in mm.delme2.find()] [{u'vals': [3, 4], u'start': 1000, u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20}, {u'vals': [3, 4], u'start': 1010, u'_id': ObjectId('5150c9cd64524c04169fd613'), u'metrictypeid': 20}, {u'vals': [3, 4], u'start': 1020, u'_id': ObjectId('5150c9d264524c04169fd614'), u'metrictypeid': 20}, {u'vals': [3, 4], u'start': 1030, u'_id': ObjectId('5150c9d764524c04169fd615'), u'metrictypeid': 20}, {u'vals': [3, 4], u'start': 1030, u'_id': ObjectId('5150c9dd64524c04169fd616'), u'metrictypeid': 10}] >>> import pprint >>> pprint.pprint([x for x in mm.delme2.find()]) [{u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20, u'start': 1000, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9cd64524c04169fd613'), u'metrictypeid': 20, u'start': 1010, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9d264524c04169fd614'), u'metrictypeid': 20, u'start': 1020, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9d764524c04169fd615'), u'metrictypeid': 20, u'start': 1030, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9dd64524c04169fd616'), u'metrictypeid': 10, u'start': 1030, u'vals': [3, 4]}] >>> mm.runCommand( { 'findAndModify':'delme2', 'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1401, in __call__ self.__name) TypeError: 'Collection' object is not callable. If you meant to call the 'runCommand' method on a 'Database' object it is failing because no such method exists. >>> mm.delme2.runCommand( { 'findAndModify':'delme2', 'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1405, in __call__ self.__name.split(".")[-1]) TypeError: 'Collection' object is not callable. If you meant to call the 'runCommand' method on a 'Collection' object it is failing because no such method exists. >>> mm.command( { 'findAndModify':'delme2', 'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/database.py", line 395, in command msg, allowable_errors) File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/helpers.py", line 144, in _check_command_response raise OperationFailure(msg % details["errmsg"]) pymongo.errors.OperationFailure: command {'sort': {'start': 1}, 'query': {'metrictypeid': 20}, 'findAndModify': 'delme2', 'update': {'$push': {'vals': 5}}, 'new': True} failed: no such cmd: sort >>> mm.command( { 'findAndModify':'delme2', 'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/database.py", line 395, in command msg, allowable_errors) File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/helpers.py", line 144, in _check_command_response raise OperationFailure(msg % details["errmsg"]) pymongo.errors.OperationFailure: command {'sort': {'start': 1}, 'query': {'metrictypeid': 20}, 'findAndModify': 'delme2', 'update': {'$push': {'vals': 5}}, 'new': True} failed: no such cmd: sort >>> mm.delme2.findAndModify({'query': 'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); File " ", line 1 mm.delme2.findAndModify({'query': 'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); ^ SyntaxError: invalid syntax >>> mm.delme2.findAndModify({'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1405, in __call__ self.__name.split(".")[-1]) TypeError: 'Collection' object is not callable. If you meant to call the 'findAndModify' method on a 'Collection' object it is failing because no such method exists. >>> mm.delme2.findAndModify({query: {metrictypeid:20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in NameError: name 'metrictypeid' is not defined >>> mm.delme2.findAndModify({'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1405, in __call__ self.__name.split(".")[-1]) TypeError: 'Collection' object is not callable. If you meant to call the 'findAndModify' method on a 'Collection' object it is failing because no such method exists. >>> mm.delme2.findAndModify({'query': {'metrictypeid':20}, 'sort': { 'start' : 1}, 'update' : { '$push' : { 'vals' : 5 } }, 'new': True}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1405, in __call__ self.__name.split(".")[-1]) TypeError: 'Collection' object is not callable. If you meant to call the 'findAndModify' method on a 'Collection' object it is failing because no such method exists. >>> mm.delme2.find() >>> pprint([x for x in mm.delme2.find()]) Traceback (most recent call last): File " ", line 1, in TypeError: 'module' object is not callable >>> pprint.pprint([x for x in mm.delme2.find()]) [{u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20, u'start': 1000, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9cd64524c04169fd613'), u'metrictypeid': 20, u'start': 1010, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9d264524c04169fd614'), u'metrictypeid': 20, u'start': 1020, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9d764524c04169fd615'), u'metrictypeid': 20, u'start': 1030, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9dd64524c04169fd616'), u'metrictypeid': 10, u'start': 1030, u'vals': [3, 4]}] >>> mm.delme2.findAndModify({'metrictypeid':20}, { '$push' : { 'vals' : 5 }}); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1405, in __call__ self.__name.split(".")[-1]) TypeError: 'Collection' object is not callable. If you meant to call the 'findAndModify' method on a 'Collection' object it is failing because no such method exists. >>> mm.delme2.findAndUpdate() Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1405, in __call__ self.__name.split(".")[-1]) TypeError: 'Collection' object is not callable. If you meant to call the 'findAndUpdate' method on a 'Collection' object it is failing because no such method exists. >>> mm.findAndUpdate() Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1401, in __call__ self.__name) TypeError: 'Collection' object is not callable. If you meant to call the 'findAndUpdate' method on a 'Database' object it is failing because no such method exists. >>> db Traceback (most recent call last): File " ", line 1, in NameError: name 'db' is not defined >>> mm.delme2.find_and_modify({'metrictypeid':20}, { '$push' : { 'vals' : 5 }}); {u'vals': [3, 4], u'start': 1000, u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20} >>> pprint.pprint([x for x in mm.delme2.find()]) [{u'_id': ObjectId('5150c9cd64524c04169fd613'), u'metrictypeid': 20, u'start': 1010, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9d264524c04169fd614'), u'metrictypeid': 20, u'start': 1020, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9d764524c04169fd615'), u'metrictypeid': 20, u'start': 1030, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9dd64524c04169fd616'), u'metrictypeid': 10, u'start': 1030, u'vals': [3, 4]}, {u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20, u'start': 1000, u'vals': [3, 4, 5]}] >>> mm.delme2.find_and_modify(query={'metrictypeid':20}, update={'$push':{'vals':6}}, sort={'start':1},new=True); /path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py:1364: DeprecationWarning: Passing mapping types for `sort` is deprecated, use a list of (key, direction) pairs instead DeprecationWarning) {u'vals': [3, 4, 5, 6], u'start': 1000, u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20} >>> mm.delme2.find_and_modify(query={'metrictypeid':20}, update={'$push':{'vals':6}}, sort=['start',1],new=True); Traceback (most recent call last): File " ", line 1, in File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/collection.py", line 1357, in find_and_modify kwargs['sort'] = helpers._index_document(sort) File "/path/not/important/here/pylibs/lib/python2.6/site-packages/pymongo-2.4.1-py2.6-linux-x86_64.egg/pymongo/helpers.py", line 68, in _index_document for (key, value) in index_list: ValueError: too many values to unpack >>> mm.delme2.find_and_modify(query={'metrictypeid':20}, update={'$push':{'vals':6}}, sort=[['start',1]],new=True); {u'vals': [3, 4, 5, 6, 6], u'start': 1000, u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20} >>> mm.delme2.find_and_modify(query={'metrictypeid':20}, update={'$push':{'vals':7}}, sort=[['start',1]],new=True); {u'vals': [3, 4, 5, 6, 6, 7], u'start': 1000, u'_id': ObjectId('5150c9bd64524c04169fd612'), u'metrictypeid': 20} >>> mm.delme2.find_and_modify(query={'metrictypeid':20}, update={'$push':{'vals':7}}, sort=[['start',-1]],new=True); {u'vals': [3, 4, 7], u'start': 1030, u'_id': ObjectId('5150c9d764524c04169fd615'), u'metrictypeid': 20}
No comments:
Post a Comment