Python Pymongo在更新/删除操作成功后返回none

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': {

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': {'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}
?@saadrehmansah
ok:1
表示操作已完成且无错误,
n:1
报告与更新操作匹配的文档数