可以實現通過:
- 創建序列發生器,這僅僅是保持最後數目的計數器另一個文檔。
- 使用貓鼬中間件來更新自動遞增期望的字段。
這是一個工作和測試的例子與待辦事項應用程序。
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/todoApp');
// Create a sequence
function sequenceGenerator(name){
var SequenceSchema, Sequence;
SequenceSchema = new mongoose.Schema({
nextSeqNumber: { type: Number, default: 1 }
});
Sequence = mongoose.model(name + 'Seq', SequenceSchema);
return {
next: function(callback){
Sequence.find(function(err, data){
if(err){ throw(err); }
if(data.length < 1){
// create if doesn't exist create and return first
Sequence.create({}, function(err, seq){
if(err) { throw(err); }
callback(seq.nextSeqNumber);
});
} else {
// update sequence and return next
Sequence.findByIdAndUpdate(data[0]._id, { $inc: { nextSeqNumber: 1 } }, function(err, seq){
if(err) { throw(err); }
callback(seq.nextSeqNumber);
});
}
});
}
};
}
// sequence instance
var sequence = sequenceGenerator('todo');
var TodoSchema = new mongoose.Schema({
name: String,
completed: Boolean,
priority: Number,
note: { type: String, default: '' },
updated_at: { type: Date, default: Date.now }
});
TodoSchema.pre('save', function(next){
var doc = this;
// get the next sequence
sequence.next(function(nextSeq){
doc.priority = nextSeq;
next();
});
});
var Todo = mongoose.model('Todo', TodoSchema);
您可以在節點控制檯,如下
function cb(err, data){ console.log(err, data); }
Todo.create({name: 'hola'}, cb);
Todo.find(cb);
隨着每一個新創建的對象,你會看到越來越優先測試它。乾杯!
[docs](hwttp://www.wiredprairie.us/blog/index.php/archives/1524)有兩個很好的例子。您可以使用計數器示例併爲用戶標識添加一個輔助鍵,這樣每個用戶都是唯一的。 – WiredPrairie
給圖書館一個鏡頭:[mongodb-autoincrement](https://www.npmjs.com/package/mongodb-autoincrement) –