MongoDB函数说明同步插入与自动增量

时间:2015-11-11 11:19:40

标签: mongodb mongoose mongodb-query

在mongoDB文档的以下链接中: https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

有关如何使用自动增量_id构建“安全”插入的说明。 我的问题是:

  1. 我应该在哪里定义函数?
  2. 我以后怎么称呼它?
  3. 我无法退出,了解函数是否存储为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;
    }
    }
    

1 个答案:

答案 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模块。实际上你可能会更好地使用它:

https://www.npmjs.com/package/mongoose-auto-increment