热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Pymongo在成功的更新/删除操作后返回none。-Pymongoreturnsnoneaftersuccessfulupdate/removeoperations

Thepymongodocumentationsays:pymongo文档说:Bydefaultanacknowledgmentisrequestedfromthes

The pymongo documentation says:

pymongo文档说:

By default an acknowledgment is requested from the server that the update was successful, raising OperationFailure if an error occurred.

默认情况下,来自服务器的确认请求更新是成功的,如果出现错误,将导致操作失败。

I am using Pymongo 2.7.1 with Python 2.7.5. Following operation returns None, whether the operation is successful or not:

我使用的是Pymongo 2.7.1和Python 2.7.5。以下操作不返回,操作是否成功:

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}})

In second statement I am trying to pull a something which does not exist in friend_list.

在第二个语句中,我尝试在friend_list中提取一个不存在的东西。

Same happens with remove also. It's also returns None, be the operation is successful or unsuccessful i.e. if it removed the document or not:

删除也是一样。它也没有返回,操作是成功的或者是不成功的,如果它删除了文档:

user_db.remove({'name': 'john'}

I passed w=1 and I receive following response:

我通过w=1,得到响应:

{u'ok': 1.0, u'err': None, u'connectionId': 12037, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403099751, 1)}

{u' ': 1.0, u' ':没有,u' connectionid: 12037, u'n': 1, u' updatedexisting ': True, u' lastop ':时间戳(1403099751,1)}

when I manually check the DB, I see it has pulled the name from friend_list. Now if I run same again i.e. trying to pull a name which does not exist in friend_list:

当我手动检查DB时,我看到它从friend_list中提取了名称。现在,如果我再次运行,比如试图拉一个在friend_list中不存在的名字:

{u'ok': 1.0, u'err': None, u'connectionId': 12037, u'n': 1, u'updatedExisting': True, u'lastOp': Timestamp(1403099873, 1)}

{u' ': 1.0, u'err: None, u' connectionid: 12037, u'n': 1, u' updatedexisting ': True, u' lastop ':时间戳(1403099873,1)}

It is same as earlier.

它和前面一样。

So how do I know whether the update and delete operations are successful or not?

那么我如何知道更新和删除操作是否成功呢?

EDIT: As answers pointed out, I was using connection instead of MongoClient. Now I have updated, remove is working. However update is not working properly:

编辑:正如答案所指出的,我使用的是连接而不是MongoClient。现在我已经更新,删除正在工作。但是更新不能正常工作:

>>> 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)}
>>>

The last statement is trying to remove an item from a list, even though the item no longer exists in the list.

最后一个语句试图从列表中删除一个项目,即使该项目不再存在于列表中。

2 个解决方案

#1


1  

You're mixing the terms. The section of the documentation you highlighted is referring to the write acknowledgement not number of documents that were updated.

你是混合的。您突出显示的文档部分指的是写入确认,而不是更新的文档数量。

In short, when driver sends a write command to MongoDB and you have the the default write acknowledgment (w=1) the driver will throw an OperationFailure error if MongoDB doesn't confirm that the updated completed successful. You can read more details about it on the MongoDB pages.

简而言之,当驱动程序向MongoDB发送一个写命令,并且您有默认的写确认(w=1)时,如果MongoDB不确认更新完成的成功,那么驱动程序将抛出一个OperationFailure错误。您可以在MongoDB页面上阅读更多有关它的详细信息。

Both of your updates were actually successful (MongoDB confirmed that the update was applied). That's why you didn't get an error. Your problem is that your update query didn't actually update any documents.

您的两个更新实际上都是成功的(MongoDB确认了更新的应用)。这就是为什么你没有出错。您的问题是更新查询实际上并没有更新任何文档。

If you do that update in a MongoDB shell v2.6+, where no document are actually modified, you will get a result like this:

如果您在MongoDB shell v2.6+中进行更新,在没有修改文档的情况下,您将得到这样的结果:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

And the result for an update that actually changed a document will look like this:

更新后的结果是这样的:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Edit:

编辑:

I was using the older version of pymongo (2.6.3) installed on Ubuntu with apt-get and I was getting the same response for the update query as you were getting.

我使用的是pymongo的旧版本(2.6.3),安装在Ubuntu上的apt-get,我得到的更新查询的响应和你得到的一样。

I removed the python-pymongo package and updated to newest version of pymongo using pip. I got the following response from update that modified a document:

我删除了python-pymongo包并使用pip更新到最新版本的pymongo。我得到了修改后的更新文件的响应:

{'updatedExisting': True, u'nModified': 1, u'ok': 1, u'n': 1}

I tested this on MongoDB 2.6. using this code.

我在MongoDB 2.6上测试了这个。使用这个代码。

from pymongo import MongoClient

m = MongoClient('localhost', 27017)

db = m.test

print db.test.update({}, {'$pull': {'a'  : 1}})

Edit2

Edit2

That's because you're using MongoDB 2.4. If you're using sandbox/free versions on MongoHQ you can't currently change that (link).

这是因为您使用的是MongoDB 2.4。如果你在MongoHQ上使用沙箱/免费版本,你现在不能改变这个(链接)。

MongoDB 2.6 is returning updatedExisting field in the response to the update command (which is one that's important to you). I suspect that's because the changed write protocol in v 2.6:

MongoDB 2.6在对update命令的响应中返回updatedExisting字段(这对您来说很重要)。我怀疑这是因为v2.6中修改的写入协议:

A new protocol for write operations integrates write concerns with the write operations, eliminating the need for a separate getLastError command. Write methods now return the status of the write operation, including error information.

写操作的新协议将写操作与写操作集成在一起,消除了对单独的getLastError命令的需要。写方法现在返回写操作的状态,包括错误信息。

#2


0  

I assume you're using pymongo.Connection, which does unacknowledged writes to MongoDB by default. Therefore Connection doesn't tell you the outcome of your update operation.

我猜你在用pymongo。连接,默认情况下不承认写入MongoDB。因此,连接不会告诉您更新操作的结果。

Connection is deprecated; you should use pymongo.MongoClient instead. MongoClient has many advantages, including that it does acknowledged writes by default. If you use MongoClient you'll get information about each update:

连接弃用;您应该使用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)}

推荐阅读
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文介绍了一种简化版的在线购物车系统,重点探讨了用户登录和购物流程的设计与实现。该系统通过优化界面交互和后端逻辑,提升了用户体验和操作便捷性。具体实现了用户注册、登录验证、商品浏览、加入购物车以及订单提交等功能,旨在为用户提供高效、流畅的购物体验。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • 本文深入探讨了NDK与JNI技术在实际项目中的应用及其学习路径。通过分析工程目录结构和关键代码示例,详细介绍了如何在Android开发中高效利用NDK和JNI,实现高性能计算和跨平台功能。同时,文章还提供了从基础概念到高级实践的系统学习指南,帮助开发者快速掌握这些关键技术。 ... [详细]
  • 本文首先回顾了MySQL在数据字典方面的发展历程,从MySQL 4.1引入的information_schema数据字典开始,使得用户能够通过标准SQL查询轻松获取系统元数据。在此基础上,深入探讨了MySQL 5.7中SYS模式的架构与应用场景,详细解析了其在性能监控、查询优化等方面的优势与实际应用。 ... [详细]
author-avatar
彭润昕_149
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有