2015-11-11 47 views
1

插入在从MongoDB的文档以下链接: https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/MongoDB的功能澄清同步,支持自动增量

有关于如何建立一个“安全”的解释,支持自动增量_id插入。 我的问题是:

  1. 我应该在哪里定义函数?
  2. 我以后怎么称呼它?

我无法退出理解,如果函数存储为一个JS函数是一个JS文件?或者它存储在数据库中?或者是其他东西。

谢谢。

下面是实际的功能,因为它是在上面的链接带来的:

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

其实这仅仅是[“乐观循环”(https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing -field /#auto-increment-optimistic-loop)示例实现。没有任何代码与JavaScript实现“绑定”。你需要阅读的核心部分是关于['.findAndModify()'](https://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/)方法以及它是如何在那里的例子中实现,是一个值递增,然后返回用作“自动递增键”。 –

+0

核心驱动程序方法(以及实现示例)适用于所有语言。所以这只是一个原则。通过增加当前值来更新并返回存储在另一个集合中的值,然后使用返回的值作为“递增键”。 –

+0

你能解释一下我如何在我的数据库中使用乐观循环实现?步骤是什么?我的意思是,如果我希望每个插入的文档在某个/所有集合中都有一个自动增量_id,但我需要它也是安全的。 – TBE

回答

1

实施办法

这里有一个如何与猫鼬实现一个自动递增字段的例子:

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处理。

现有模块

此外,有一个专门用于处理自动增加的编号创建的猫鼬模块。你实际上可能会更好使用它:

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