在mongoDB文档的以下链接中: https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
有关如何使用自动增量_id
构建“安全”插入的说明。
我的问题是:
我无法退出,了解函数是否存储为JS函数是JS文件?还是存储在DB中?或其他什么。
感谢。
以下是上面链接中的实际功能:
function insertDocument(doc, targetCollection) {
while (1) {
var cursor = targetCollection.find( {}, { _id: 1 } ).sort( { _id: -1 } ).limit(1);
var seq = cursor.hasNext() ? cursor.next()._id + 1 : 1;
doc._id = seq;
var results = targetCollection.insert(doc);
if( results.hasWriteError() ) {
if( results.writeError.code == 11000 /* dup key */ )
continue;
else
print( "unexpected error inserting data: " + tojson( results ) );
}
break;
}
}
答案 0 :(得分:1)
以下是如何使用mongoose实现自动增量字段的示例:
var CounterSchema = Schema({
_id: {type: String, required: true},
seq: { type: Number, default: 0 }
});
var counter = mongoose.model('counter', CounterSchema);
var entitySchema = mongoose.Schema({
testvalue: {type: String}
});
entitySchema.pre('save', function(next) {
var doc = this;
counter.findByIdAndUpdate({_id: 'entityId'}, {$inc: { seq: 1} }, function(error, counter) {
if(error)
return next(error);
doc.testvalue = counter.seq;
next();
});
});
来源:https://stackoverflow.com/a/30164636/236660
请注意,对于您使用此代码的每个集合,{_id: 'entityId'}
应设置不同。因此,如果您为entitySchema
生成ID,则您将{_id: 'entityId'}
。对于userSchema
,您将使用{_id: 'userId'}
等。您需要这样做,以便每个集合都有自己的自动递增序列。
上面的代码是线程安全的。 findByIdAndUpdate
操作是原子的;它的一致性和并发性由MongoDB处理。
此外,还有一个专门用于处理自动增量ID的mongoose模块。实际上你可能会更好地使用它: