Python Pymongo在更新/删除操作成功后返回none
pymongo说: 默认情况下,从服务器请求确认 更新成功,如果发生错误,将引发Python Pymongo在更新/删除操作成功后返回none,python,mongodb,pymongo,Python,Mongodb,Pymongo,pymongo说: 默认情况下,从服务器请求确认 更新成功,如果发生错误,将引发OperationFailure 我将Pymongo 2.7.1与Python 2.7.5结合使用。无论操作是否成功,以下操作都返回None: user_db.update({'email_id': user_email}, {'$pull': {'friend_list': existing_friend}}) user_db.update({'email_id': user_email}, {'$pull': {
OperationFailure
我将Pymongo 2.7.1与Python 2.7.5结合使用。无论操作是否成功,以下操作都返回None
:
user_db.update({'email_id': user_email}, {'$pull': {'friend_list': existing_friend}})
user_db.update({'email_id': user_email}, {'$pull': {'friend_list': non_existing_friend}})
在第二个语句中,我试图提取一个在朋友列表中不存在的东西
删除也会发生同样的情况。无论操作成功或不成功,也就是说,如果它删除了文档或没有删除文档,它都会返回None:
user_db.remove({'name': 'john'}
我通过了w=1
,并收到以下响应:
{u'ok':1.0,u'err':无,u'connectionId':12037,u'n':1,
u'UpdateExisting':True,u'lastOp':时间戳(1403099751,1)}
当我手动检查数据库时,我看到它已从好友列表中提取了名称。现在,如果我再次运行相同的程序,即尝试提取一个在朋友列表中不存在的名称
:
{u'ok':1.0,u'err':无,u'connectionId':12037,u'n':1,
u'UpdateExisting':True,u'lastOp':时间戳(1403099873,1)}
和前面一样
那么,我如何知道更新和删除操作是否成功
编辑:正如答案所指出的,我使用的是连接而不是MongoClient。现在我已经更新了,remove
正在工作。但是,更新
工作不正常:
>>> conn = pymongo.MongoClient(MONGOHQ_URL)
>>> db = conn['test']
>>> test_collection = db.test
>>>
>>> test_collection.insert({'name': 'john'})
ObjectId('53a25612a760360253920619')
>>>
>>> test_collection.update({'name': 'john'}, {'$addToSet': {'friends': 'merry'}})
{u'ok': 1.0, u'err': None, u'connectionId': 12317, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403147936, 1)}
>>>
>>> test_collection.update({'name': 'john'}, {'$pull': {'friends': 'merry'}})
{u'ok': 1.0, u'err': None, u'connectionId': 12317, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403147959, 1)}
>>>
>>> test_collection.update({'name': 'john'}, {'$pull': {'friends': 'merry'}})
{u'ok': 1.0, u'err': None, u'connectionId': 12317, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403147963, 1)}
>>>
最后一条语句试图从列表中删除某个项,即使该项在列表中已不存在。您混淆了术语。您强调的文档部分指的是书面确认,而不是更新的文档数量
简言之,当驱动程序向MongoDB发送写入命令时,如果MongoDB未确认更新成功完成,则驱动程序将抛出操作失败
。你可以在网站上阅读更多的细节
您的两个更新实际上都成功了(MongoDB确认应用了更新)。这就是为什么你没有出错。您的问题是,您的更新查询实际上没有更新任何文档
如果您在MongoDB shell v2.6+中执行该更新,实际上没有修改任何文档,您将得到如下结果:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
实际更改文档的更新结果如下所示:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
编辑:
我使用的是安装在Ubuntu上的pymongo(2.6.3)的旧版本,带有apt-get
,我得到的更新查询响应与您得到的相同
我删除了python-pymongo包,并使用pip
更新到pymongo的最新版本。我从修改文档的更新中得到以下响应:
{'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1}
我在MongoDB 2.6上测试了这个。使用此代码
from pymongo import MongoClient
m = MongoClient('localhost', 27017)
db = m.test
print db.test.update({}, {'$pull': {'a' : 1}})
Edit2
这是因为您使用的是MongoDB 2.4。如果您在MongoHQ上使用沙盒/免费版本,则当前无法更改()
MongoDB 2.6在对update命令的响应中返回updateexisting
字段(这对您很重要)。我怀疑这是因为v 2.6中更改了写入协议:
一种新的写操作协议将写关注点与
写入操作,无需单独的getLastError
指挥部。写入方法现在返回写入操作的状态,
包括错误信息
我假设您使用的是pymongo.Connection
,默认情况下,它对MongoDB进行未确认的写入。因此,连接不会告诉您更新操作的结果
连接已弃用;您应该改用pymongo.MongoClient
。MongoClient有许多优点,包括它在默认情况下不进行确认写入。如果使用MongoClient,您将获得有关每个更新的信息:
>>> import pymongo
>>> collection = pymongo.MongoClient().test.collection
>>> collection.insert({'_id': 1, 'array': ['a']})
1
>>> collection.update({'_id': 1}, {'$pull': {'array': 'a'}})
{u'nModified': 1, u'ok': 1, u'n': 1, 'updatedExisting': True, u'electionId': ObjectId('53a1a6bd30492fdb9fb5610a'), u'lastOp': Timestamp(1403111261, 1)}
^我已经更新了问题。如果对同一文档执行另一次pull
,响应是相同的。但是n
和ok
的意思是:{'updatedExisting':True,u'nModified':1,u'ok':1,u'n':1}
?@saadrehmansahok:1
表示操作已完成且无错误,n:1
报告与更新操作匹配的文档数