Node.js环境中MongoDB设置自增主键并获取主键

MongoDB本身没有自增主键设置,这里借助另外一个文档用于保存自增主键。

const mongoose = require('mongoose');
const DB_URL = "mongodb://localhost/test";
mongoose.connect(DB_URL, { useNewUrlParser: true });
mongoose.Promise = Promise;
const Schema = mongoose.Schema;
// 生成自增主键的类,countName为键名,count为键值
let Counters = new Schema({
    countName: String,
    count: Number
});
// 添加静态方法用于自增主键的更新
Counters.statics.findAndModify = function (query, sort, doc, options, callback) {
    return this.collection.findAndModify(query, sort, doc, options, callback);
}
const Counter = mongoose.model("Counter", Counters);

// 生成自增主键的函数
function incrementCounter(itemName, callback) {
    Counter.findAndModify(
    { countName: itemName },
    [],
    { $inc: { count: 1 } },
    { "new": true, upsert: true },
    function (err, result) {
        if (err)
            callback(err);
        else
            callback(null, result.value.count);
    });
}

// 将自增主键函数包裹一层Promise便于使用await返回值
async function counter(str) {
    return new Promise((resolve, reject) => {
        incrementCounter(str, (err, num) => {
                console.log(arguments);
                if (err) {
                console.log("Error: " + err);
                reject(err);
            }
            console.log("Result: " + num);
            // 使用resolve()函数将回调函数的返回值传出
            resolve(num);
        });
    });
}

使用时在需要添加自增主键的文档中使用异步函数调用counter(str)函数(str为键名)即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值