2017-03-11 114 views
1

我明白這個問題有點混亂。忍受我,MongoDB,具有增量屬性的對象的數組字段

比方說,我有一個包含學生屬性數組的文檔類。現在這些學生應該有一個增量ID,但我不知道如何在併發插入推送查詢到文檔時如何做到這一點。

例子:

假設類是我在數據庫文件。

var class = { 
    'students':[{ 
     'name': 'Bob' 
     'id' :1 
    }] 
} 

現在如果我要插入推動學生莎莉({'name': 'Sally'})到class.students我想她得到2作爲ID。

我可以查詢獲取最新的ID在數據庫中,並加一,並使用它作爲Sally的ID。

但是,我不知道當兩個不同的請求同時發生時會發生什麼,其中一個嘗試插入推Sally和其他傑克。我怎樣才能確保薩莉和傑克不會得到相同的ID?

注意;我不想依賴ID字段的數組索引。

+0

使用GUID或UUID這些最有可能在每次創建時都是唯一的。 – Karthik

+0

對,但我也希望該ID可讀。我想將bob稱爲「Student-1」而不是「Student-asfasf29-dajs-doajsdo2ke-12」。 – Hasan

回答

1

你可以用計數器收集

1.Insert的幫助下到櫃檯集合做到這一點,對於studentId初始值:

db.counters.insert(
    { 
     _id: "studentId", 
     seq: 0 
    } 
) 

2.創建一個接受的名字getNextSequence功能序列。該函數使用findAndModify()方法來原子遞增序列值,並返回這個新值

function getNextSequence(name) { 
    var ret = db.counters.findAndModify(
      { 
      query: { _id: name }, 
      update: { $inc: { seq: 1 } }, 
      new: true 
      } 
    ); 

    return ret.seq; 
} 

由於findAndModify是原子操作,getNextSequence()總是會返回一個值,即使在併發請求的情況下, 。

3.使用插入這段getNextSequence()函數/推約自動遞增序列字段

//let's assume you already have a 'student' variable that represents a student doc 
student['id'] = getNextSequence("studentId"); 
db.classes.update(
    { _id: 1 }, 
    { $addToSet: { students: student } } 
) 

更多細節可在corresponding tutorial有關MongoDB的網站上找到。

相關問題