mongodb 事务学习总结

时间:2019-04-17 14:47:03   收藏:0   阅读:201

一、预备工作

1.MongoDB需要4.0版本+

2.需要自己搭建MongoDB复制集,单个mongodb server 不支持事务。

事务原理:mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。mongodb各个节点常见的搭配方式为:一主一从、一主多从。主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

3.搭建复制集步骤

 

    成功后如图:

    技术分享图片

 

    效果如图:

    技术分享图片

    成功的结果是(ok项是1,失败是0)

    查看是否是主节点 rs.isMaster()

    查看复制集状态 rs.status()

  

二、复制集中的坑点

1.需使用mongoose.connection对集合进行事务操作,其他model的CRUD方法不支持事务

mongoose.connection.collection(‘集合名‘) // 注:集合名需要小写且加s,如model为Cat,集合名这里应写为cats

2.触发Schema定义的中间件默认值需要构造model实例

const CatSchema = new Schema({
    name: {
        type: String
        default: ‘cat‘
    },
    created: {
     type: Date,
     default: Date.now
  }
})

const Cat = mongoose.model(‘Cat‘, CatSchema)

new Cat() // 触发中间件

  

 3.insertOne,findOneAndUpdate等方法对数据的新增,需上面第二点进行依赖,否则直接insertOne 插入一条数据,定义的默认值不会触发,如created字段,chema内部定义的type: Schema.ObjectId的相应字段,insertOne插入后都会变成字符串类型,不是Schema.ObjectId类型

// 解决方式
//新增

const Cat= new Cat();
const data = {name: 5}
for (let key in data) {
      Cat[key] = data[key];
    }
db.collection(‘cats‘).insertOne(Cat);

// 查询修改

db.collection(‘cats‘)
.findOneAndUpdate({_id: mongoose.Types.ObjectId(你的id)}, {$set: {name: 修改值}})

  

三、开始事务

注:以下皆为egg实例代码

 

  以上就是思考总结,完毕

原文:https://www.cnblogs.com/doudoujs/p/10711895.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!