2015-11-11 87 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