mongoose实现mongodb的自增字段
- 需求:
实现任意指定字段作为自增字段, 类似于oracle的sequence - 实现思想:
新建一个Counter的Schema用来专门记录sequence的增长情况。之后每次保存新数据之前都要去查询Counter的sequence, 将查询的sequence使用$inc加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);
- 如何运用
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;
}
})
});
};
- 总的来说这里还涉及到异步操作, 也可以用async/await让代码变得稍微好看一点, 这里我就不做详解啦,如果有需求可以评论私聊我哦!
- 在此之前, 我还试过一些相关的插件, 感觉不太行,可能是我的操作不对?下面补上,感兴趣的读者可以自行研究跟我分享啦!
- 类似于Oracle自增id的一款mongoose插件:(实现原理应该跟Counter是一样的)
- 生成看上去相对短的ID: (实际上也不短,然后不是很好控制, 然后可能会重复, 几率比较小啦)
最后附上学习文档 :http://mongoosejs.net/docs/api.html#findbyidandupdate_findByIdAndUpdate
说到后面的话
初次学习, 若有不当之处, 请各位大佬评论指正哦!