【发布时间】:2014-06-19 16:38:46
【问题描述】:
pymongo documentation 说:
默认情况下,服务器会请求确认 更新成功,如果发生错误,将引发
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}})
在第二个语句中,我试图提取friend_list 中不存在的东西。
remove 也会发生同样的情况。它也返回 None,无论操作是成功还是不成功,即是否删除了文档:
user_db.remove({'name': 'john'}
我通过w=1 收到以下回复:
{u'ok': 1.0, u'err': 无, u'connectionId': 12037, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403099751, 1)}
当我手动检查数据库时,我看到它从friend_list 中提取了名称。现在,如果我再次运行相同的操作,即尝试提取 friend_list 中不存在的名称:
{u'ok': 1.0, u'err': 无, u'connectionId': 12037, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403099873, 1)}
和之前一样。
那么我怎么知道更新和删除操作是否成功呢?
编辑:正如答案所指出的,我使用的是连接而不是 MongoClient。现在我更新了,remove 正在工作。但是update 无法正常工作:
>>> 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)}
>>>
最后一条语句试图从列表中删除一个项目,即使该项目不再存在于列表中。
【问题讨论】: