2014-04-21 187 views
18

給出模式創建獨特的自動遞增領域:與貓鼬

var EventSchema = new Schema({ 
    id: { 
     // ... 
    }, 
    name: { 
     type: String 
    }, 
}); 

我要讓id獨特的自動遞增。我試圖實現mongodb implementation,但有理解如何正確使用貓鼬的問題。

我的問題是:在沒有使用任何插件等情況下,在貓鼬中實現自動增量字段的正確方法是什麼?

+0

我真的花了很多時間,並嘗試自己做。對不起,這樣一個虛擬的問題 –

+0

我試圖增加ID預保存。但我如何處理櫃檯收集?我必須有架構嗎?這是我不知道的問題 –

回答

25

下面是使用貓鼬自動遞增場執行的一個很好的例子:

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(); 
    }); 
}); 

你應該首先mongodb documentation執行步驟1。

+0

我無法在鏈接中找到第1步。 也許它改變了? – Igal

+2

我已修復鏈接。你必須在「counters」集合({_id:'entityId',seq:0})中插入一個初始值 – edtech

1

是的,這是該功能的「瘦」。

您需要在您的mongo數據庫中擁有該集合。如果你願意,它可以作爲併發密鑰分配單個真值記錄。 Mongo的示例向您展示瞭如何執行「原子」操作來獲取下一個密鑰,並確保即使有併發請求,您也可以保證返回的唯一密鑰不會發生衝突。

但是,mongodb本身並沒有實現這個機制,它們告訴你如何去做。它們只提供_id作爲唯一的文檔密鑰。我希望這能澄清你的方法。

爲了擴展這個想法,繼續將mongo建議的實現添加到您定義的Mongoose模型中,並且您已經猜到了,在Pre-save或更好的pre-init事件中使用它,以確保您始終生成一個id if在將其保存到mongo之前,您需要使用收集服務器端。