mongodb支持事务吗
MongoDB4.0引进的业务功用,支持多文档ACID特性,例如运用mongoshell进行业务操作。
>s=db.getMongo().startSession()
session{“id”:UUID(“3bf55e90-5e88-44aa-a59e-a30f777f1d89”)}
>s.startTransaction()
>session.getDatabase(“mytest”).coll01.insert({x:1,y:1})
WriteResult({“nInserted”:1})
>session.getDatabase(“mytest”).coll02.insert({x:1,y:1})
WriteResult({“nInserted”:1})
>s.commitTransaction()(或许s.abortTransaction()回滚业务)
支持MongoDB4.0的其他言语Driver也封装了业务相关接口,用户需求创建一个Session,然后在Session上敞开业务,提交业务。例如:
python版别
withclient.start_session()ass:
s.start_transaction()
collection_one.insert_one(doc_one,session=s)
collection_two.insert_one(doc_two,session=s)
s.commit_transaction()
java版别
try(ClientSessionclientSession=client.startSession()){
clientSession.startTransaction();
collection.insertOne(clientSession,docOne);
collection.insertOne(clientSession,docTwo);
clientSession.commitTransaction();
}
一、预备工作
1、MongoDB需求4.0版别+
2、需求自己建立MongoDB仿制集,单个mongodbserver不支持业务。
业务原理:mongodb的仿制至少需求两个节点。其间一个是主节点,担任处理客户端请求,其余的都是从节点,担任仿制主节点上的数据。mongodb各个节点常见的搭配办法为:一主一从、一主多从。主节点记载在其上的所有操作oplog,从节点定时轮询主节点获取这些操作,然后对自己的数据副本履行这些操作,从而保证从节点的数据与主节点一致。
3、建立仿制集过程
发动mongo主节点实例,bin目录下指令窗口履行,仿制集命名为doudou,8080端口的数据库文件坐落db1目录下,–dbpath=途径写自己的,发动后勿关闭指令窗口
1
mongod–replSetdoudou–dbpath=E:mongoDbdatadb1–port=8080
发动mongo从节点实例,bin目录下指令窗口履行,仿制集命名为doudou,8081端口的数据库文件坐落db2目录下,–dbpath=途径写自己的,发动后勿关闭指令窗口
1
mongod–replSetdoudou–dbpath=E:mongoDbdatadb2–port=8081
两个节点发动后,bin目录下翻开指令窗口,衔接主节点
1
mongo–port=8080
指令初始化
1
rs.initiate()
两个节点发动后,bin目录下翻开指令窗口,衔接主节点
1
mongo–port=8080
成功后如图:
指令初始化
1
rs.initiate()
效果如图:
成功的结果是(ok项是1,失败是0)
检查是否是主节点rs.isMaster()
检查仿制集状况rs.status()
初始化配置
1
rs.conf()
向主节点增加从节点
1
rs.add(“localhost:8081″)
检查主节点状况
1
rs.status()
仿制集配置完成。
二、仿制集中的坑点
1、需运用mongoose.connection对调集进行业务操作,其他model的CRUD办法不支持业务。
1
mongoose.connection.collection(‘调集名’)//注:调集名需求小写且加s,如model为Cat,调集名这里应写为cats
2、触发Schema定义的中间件默认值需求构造model实例
constCatSchema=newSchema({
name:{
type:String
default:’cat’
},
created:{
type:Date,
default:Date.now
}
})
constCat=mongoose.model(‘Cat’,CatSchema)
newCat()//触发中间件
3、insertOne,findOneAndUpdate等办法对数据的新增,需上面第二点进行依靠,否则直接insertOne刺进一条数据,定义的默认值不会触发,如created字段,chema内部定义的type:Schema.ObjectId的相应字段,insertOne刺进后都会变成字符串类型,不是Schema.ObjectId类型。
//处理办法
//新增
constCat=newCat();
constdata={name:5}
for(letkeyindata){
Cat[key]=data[key];
}
db.collection(‘cats’).insertOne(Cat);
//查询修改
db.collection(‘cats’)
.findoneAndUpdate({_id:mongoose.Types.ObjectId(你的id)},{$set:{name:修改值}})
三、开始业务
注:以下皆为egg实例代码
封装获取session函数
//获取session,回滚业务
asyncgetSession(opt={
readConcern:{level:”snapshot”},
writeConcern:{w:”majority”}
}){
const{mongoose}=this.app
constsession=awaitmongoose.startSession(opt);
awaitsession.startTransaction();
returnsession
}
履行业务逻辑
const{mongoose}=this.ctx.app;
constsession=awaitthis.ctx.getSession();
constdb=mongoose.connection;
try{
constdata=this.ctx.request.body;
constCat=newthis.ctx.model.Cat();
for(letkeyindata){
Cat[key]=data[key]
}
awaitdb
.collection(‘cats’)
.insertOne(Cat,{session});
//提交业务
awaitsession.commitTransaction();
this.ctx.end();
}catch(err){
//回滚业务
awaitsession.abortTransaction();
this.ctx.logger.error(newError(err));
}finally{
awaitsession.endSession();
}

mongodb适合什么场景
网站数据:MongoDB十分合适实时插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
缓存:因为性能很高,Mongo也合适作为信息存储的缓存层。在系统重启之后,由Mongo建立的持久化缓存层能够避免基层数据资源过载。
大尺度、低价值的数据:运用传统的关系型数据库存储一些大尺度低价值数据时比较浪费资源,在此之前,很多程序员往往选择运用传统文件存储的方法。
高伸缩性的场景:Mongo十分合适由数十台或数百台服务器组成的数据库,Mongo的线路图中已经包括对MapReduce引擎的内置支撑以及集群高可用的解决方案。
用于对象及JSON数据的存储:Mongo的BSON数据格式十分合适文档化的存储及查询。
MongoDB的行业运用场景
游戏场景:运用MongoDB存储游戏用户信息,用户的配备、积分等直接以内嵌文档的方式存储,便利直接查询、更新。
物流场景:运用MongoDB存储订单信息,订单状况在运转进程中会不断更新,以MongoDB内嵌数据的方式来存储,一次查询就能将订单一切的变更信息读出来。
交际场景:运用MongoDB存储用户信息,以及用户发布的朋友圈信息,通过地理位置索引完成邻近的人、地点等功能。
物联网场景:运用MongoDB存储一切接入的智能设备,以及设备报告的日志信息,并对这些信息进行多维度的分析。
直播:运用MongoDB存储用户信息、礼物信息等。
评论前必须登录!
注册