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为键名)即可。