mongoose实现mongodb的自增字段

mongoose实现mongodb的自增字段

  1. 需求:
    实现任意指定字段作为自增字段, 类似于oracle的sequence
  2. 实现思想:
    新建一个Counter的Schema用来专门记录sequence的增长情况。之后每次保存新数据之前都要去查询Counter的sequence, 将查询的sequence使用$inc加1后返回赋值给要自增的字段, 最后保存数据。

实例

  1. 定义Counter Model
const CounterSchema = db.mongoose.Schema({
    _id: { type: String, required: true },
    seq: { type: Number, default: 0 }
});

const Counter = db.mongoose.model('counter', CounterSchema);
  1. 如何运用
const saveBook = (book) => {
        db.Counter.findOneAndUpdate(  // 这里采用的是db.collection.findOneAndUpdate() 格式的方法
            { _id: 'bookIdSeqGenerator' },  // 这里的_id值以后用的地方都不要改的, 因为我们始终查询的是一个sequence
            { $inc: { seq: 1 } },  // 这里的$inc是原子操作,所以不要担心锁竞争的情况
            {
                new: true,
                upsert: true
            }, (error, counter) => {
                if (error) {
                    console.log("find counter sequence encountered error ", error);
                    throw error;
                }
                book.bookID= counter.seq;  // 将新的sequence赋值给需要改的的自增字段(这个字段也是Number类型哦)
                db.Book.create(book, (error, doc) => {
                    if (error) {
                        console.log("save book encountered error ", error);
                        throw error;
                    }
                })
            });
    };
  1. 总的来说这里还涉及到异步操作, 也可以用async/await让代码变得稍微好看一点, 这里我就不做详解啦,如果有需求可以评论私聊我哦!
  2. 在此之前, 我还试过一些相关的插件, 感觉不太行,可能是我的操作不对?下面补上,感兴趣的读者可以自行研究跟我分享啦!
  • 类似于Oracle自增id的一款mongoose插件:(实现原理应该跟Counter是一样的)
    在这里插入图片描述
  • 生成看上去相对短的ID: (实际上也不短,然后不是很好控制, 然后可能会重复, 几率比较小啦)
    在这里插入图片描述

最后附上学习文档 :http://mongoosejs.net/docs/api.html#findbyidandupdate_findByIdAndUpdate

说到后面的话

初次学习, 若有不当之处, 请各位大佬评论指正哦!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值