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

說到後面的話

初次學習, 若有不當之處, 請各位大佬評論指正哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章