首先列一下WriteConcern的几种抛出异常的级别参数:
- WriteConcern.NONE:没有异常抛出
- WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
- WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
- WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
- WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
- WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
- WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
当我们执行如下操作时(将"name"为"lily"的"age"设置为20):
db.update({"name":"lily"},{"$set":{"age":20}})
默认情况下,该操作会使用WriteConcern.NORMAL(仅在网络错误时抛出异常),等同于:
db.update({"name":"lily"},{"$set":{"age":20}},WriteConcern.NORMAL)
使用NORMAL模式参数,可以使得写操作效率非常高。但是如果此时服务器出错,也不会返回错误给客户端,而客户端会误认为操作成功。
因此在很多重要写操作中需要使用WriteConcern.SAFE模式,保证可以感知到这个错误,保证客户端和服务器对一次操作的正确性认知保持一致。
(根据笔者测试,如果服务器发生掉电情况,客户端依然得不到当时操作的错误返回,需要特别注意)
另外在很多时候,我们需要确切知道这次写操作是否成功(或者本次更新操作影响了多少个对象),这时候就需要:
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}); if(ret.getN()>0) //操作影响的对象个数 return true; else return false;
或者:
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}); if(ret.getLastError() == null) return true; else return false;
此时,getLastError()会查询上次操作结果是否出现错误。
更进一步
然后由于mongodb中使用连接池的原因,getLastError()需要再次从连接池中获取连接,这样效率会慢一些。可以这样做:
db.requestStart(); WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}); if(ret.getLastError() == null) return true; else return false; db.requestDone();
就可以保证update操作和getLastError()使用同一个连接,并且减少了一次存/取连接的过程。
还有一个方法
此时也可以使用WriteConcern.SAFE参数:
WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}, WriteConcern.SAFE); if(ret.getLastError() == null) return true; else return false; // is equivalent to db.requestStart(); WriteResult ret = db.update({"name":"lily"},{"$set":{"age":20}}); if(ret.getLastError() == null) return true; else return false; db.requestDone();
这也是我推荐使用的方式,这样即可以高效的得到返回结果,还能感知到服务器错误,一举两得。
相关推荐
`mongodb.dll`是MongoDB数据库系统在Windows平台上运行所必需的一个动态链接库(DLL)文件,它包含了MongoDB客户端和服务器所需的关键功能。 在Windows操作系统中,`.dll`文件是一种共享库,用于存储程序执行时需要...
开发者在升级到此版本时,需要注意其预发布(beta)状态,这意味着可能存在不稳定因素,建议在生产环境使用前充分测试。 MongoDB.Bson.dll 文件是 Bson(Binary JSON)的实现,Bson 是一种二进制形式的 JSON,它...
Master the new features and capabilities of MongoDB 4.x Implement advanced data modeling, querying, and administration techniques in MongoDB Includes rich case-studies and best practices followed ...
Mastering MongoDB 3.x: An expert’s guide to building fault-tolerant MongoDB applications MongoDB has grown to become the de facto NoSQL database with millions of users—from small startups to Fortune...
在学习《Mastering MongoDB 4.x - Second Edition》这本书的过程中,读者不仅能够获得MongoDB的核心知识和技能,也能够收获一些进阶知识,例如,如何通过搭建索引来优化查询性能,如何利用聚合框架进行复杂的数据...
1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,...
大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB)...
mongoDB使用.gomongoDB使用.gomongoDB使用.go
- **配置PHP**:在php.ini文件中启用MongoDB扩展,添加`extension=mongodb.so`。 - **使用扩展**:通过`\MongoDB\Client`类实例化MongoDB客户端,执行数据库操作。 ### 总结 MongoDB作为一款强大的NoSQL数据库,...
MongoDB.Driver.dll构建在MongoDB.Driver.Core.dll之上,提供了一套更高级别的、易于使用的接口。 在C#中使用这些DLL,开发者首先需要安装MongoDB.CSharpDriver NuGet包,这将自动引入所有必需的依赖。然后,可以...
Mastering MongoDB 4.x - Second Edition - Alex Giamas(2019),MongDB优秀英文参考书籍,epub格式,欢迎下载
MongoDB 3.6 之后,建议使用 `createUser` 的 `pwd` 参数配合 ` scram-sha-256` 认证机制。 - `customData`: 可选参数,可以存储关于用户的一些自定义信息。 - `roles`: 必填参数,指定用户的角色。角色决定了用户对...
1. **安装MongoDB驱动**:为了在C#中与MongoDB交互,我们需要先安装MongoDB的C#驱动程序,通常通过NuGet包管理器进行安装,包名是`MongoDB.Driver`。 2. **连接配置**:连接到MongoDB服务器时,需要提供主机名(或...
MongoDB是一款开源、分布式、高性能的NoSQL数据库,它的出现为大数据时代的数据存储与处理提供了新的解决方案。在Linux环境中,尤其是...了解并掌握这些知识点,将有助于你在使用MongoDB时更好地管理和保护你的数据。
在“mongodb配置.rar”这个压缩包中,包含了三个关键文件,它们是“mongodb.conf”配置文件、“stop.sh”停止脚本和“run.sh”启动脚本,这些都是MongoDB在Linux环境下部署和管理时常见的文件。 首先,我们来看...
11.2.4 在哪些场景使用MongoDB?
- MongoDB官方网站(https://www.mongodb.com/download-center/community)是获取最新版本的官方渠道。你可以在这里选择你需要的版本,比如3.4.12,下载对应的Linux二进制文件`mongodb-linux-x86_64-3.4.12.tgz`。 ...
mongodb教程.zip
mongodb源码.zip