Details
-
Bug
-
Status: Closed
-
Major - P3
-
Resolution: Fixed
-
None
-
None
-
None
Description
In MongoDB 2.1.x and newer (dev versions of what will be MongoDB 2.2) getLastError requires authentication. That means you have to be authenticated to the db the getLastError message is sent to. PyMongo currently sends all getLastError messages to the admin db (the reasons are lost to history).
Here's an example of this breaking in PyMongo master:
>>> import pymongo
|
>>> c = pymongo.Connection()
|
>>> c.foo.authenticate('foo', 'pass')
|
True
|
>>> c.foo.foo.insert({'foo': 'bar'})
|
ObjectId('4ffb5678fba5225a5c58b7ff')
|
>>> c.foo.foo.find_one()
|
{u'_id': ObjectId('4ffb5678fba5225a5c58b7ff'), u'foo': u'bar'}
|
>>> c.foo.foo.insert({'foo': 'bim'}, safe=True)
|
Traceback (most recent call last):
|
File "<stdin>", line 1, in <module>
|
File "pymongo/collection.py", line 306, in insert
|
continue_on_error, self.__uuid_subtype), safe)
|
File "pymongo/connection.py", line 742, in _send_message
|
rv = self.__check_response_to_last_error(response)
|
File "pymongo/connection.py", line 678, in __check_response_to_last_error
|
helpers._check_command_response(error, self.disconnect)
|
File "pymongo/helpers.py", line 129, in _check_command_response
|
raise OperationFailure(msg % response["errmsg"])
|
pymongo.errors.OperationFailure: need to login
|
>>> for doc in c.foo.foo.find():
|
... doc
|
...
|
{u'_id': ObjectId('4ffb5678fba5225a5c58b7ff'), u'foo': u'bar'}
|
{u'_id': ObjectId('4ffb5687fba5225a5c58b800'), u'foo': u'bim'}
|
Fix PyMongo so that getLastError is sent to the db the write operation was sent to.
The workaround is to authenticate to the admin db for all operations.