首先列一下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 c#驱动 最新驱动mongodb.driver.dll 版本2.12.0-beta1,包内有MongoDB.Bson.dll 、mongodb.driver.core.dll 等文件
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...
mongodb.dll.zip
使用nodejs的koa框架连接MongoDB数据库
1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,...
大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB).zip大数据实战项目商品推荐系统源码+项目说明(Spark、Scala、MongoDB)...
MongoDb数据db.createUser的使用详解. 1、介绍官方文档; 2、实际应用举例。
Mastering MongoDB 4.x - Second Edition 完整版,pdf格式,全网唯一版本,欢迎下载学习
mongodb的应用之用python爬取网页内容并用mongodb保存. 由于mongodb是文档型数据库,区别于传统的数据库,它是用来管理文档的。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的...
mongodb linux 安装文件,版本号 3.4.12.tar.gz,大家也可以在mongodb官网下载
非常使用的文档,可以入门 可以做工具书
Mastering MongoDB 4.x - Second Edition - Alex Giamas(2019),MongDB优秀英文参考书籍,epub格式,欢迎下载
NoSQL.Manager.for.MongoDB.v.3.1.0.5, mongo 3.0 数据库可视化访问工具
MongoDB安装包.zip
MongoDB数据库.pdf 学习资料 复习资料 教学资源
11.2.4 在哪些场景使用MongoDB?
MongoDB.GridFS.dll c#类库...............................................
安装MongoDB.rtf 安装MongoDB.rtf 安装MongoDB.rtf