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
說到後面的話
初次學習, 若有不當之處, 請各位大佬評論指正哦!