2012-07-22 69 views
14

有沒有辦法在mongoose中聲明Model模式,這樣當模型被new'ed時_id字段會自動生成?有沒有辦法在貓鼬模型新建時自動生成ObjectId?

例如:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectIdSchema = Schema.ObjectId; 
var ObjectId = mongoose.Types.ObjectId; 

var PersonSchema = new Schema({ 
    _id:   ObjectIdSchema, 
    firstName:  {type: String, default: 'N/A'}, 
    lastName:  {type: String, default: 'N/A'}, 
    age:   {type: Number, min: 1} 
}); 

var Person = mongoose.model('Person', PersonSchema); 

起初,我還以爲偉大的!我會只是做

_id: {type:ObjectIdSchema, default: new ObjectId()} 

當然,這並不工作,但由於新的ObjectId()僅僅是呼籲初始化架構。所以調用新的Persion()兩次會創建兩個具有相同_id值的對象。

所以有辦法做到這一點,以便每次我做「新人()」一個新的ObjectId()生成?

我試圖這樣做的原因是因爲我需要知道新人的_id值的值進一步處理。

我也嘗試:

var person = new Person({firstName: "Joe", lastName: "Baz"}); 
person.save(function(err, doc, num){ 
    console.log(doc._id); 
}); 

即使這樣,醫生不包含的ObjectId。但如果我查看數據庫,它確實包含它。

p.s.我正在使用貓鼬2.7.1

p.p.s.我知道這樣創造人的時候,我可以手動創建的ObjectId:

var person = new Person({_id: new ObjectId(), firstName: "Joe", lastName: "Baz"}); 

,但我寧願沒有進口的ObjectId,並有新的它,我想新的一個人每次。猜我習慣於使用MongoDB的java驅動程序,我可以在模型構造函數中爲_id字段創建值。

回答

17

當你調用var person = new Person(); person._id應該給你的id(即使它還沒有被保存)。只是實例化它就足以給它一個id。您仍然可以後保存,將存儲ID以及人物對象的其餘

+2

是的,並且不需要在模式中包含'_id'字段。 – JohnnyHK 2012-07-23 00:58:57

+2

@JohnnyHK,你和Last Rose Studios都是對的。這完全如你所說。我註釋掉了「_id:ObjectIdSchema」這一行,當我new'ed Person()它有ID!但是當我沒有對它進行評論時,該ID從未生成過。多謝你們!非常感激。 – Khon 2012-07-23 03:30:37

+2

對於新的觀衆,此行爲是否因爲改變?今天我不得不提到'default:new mongoose.Types.ObjectId()'沒有它,如果我在模型模式中添加了_id,它就不起作用了! – 2015-12-11 22:06:36

6

相反的:

_id: {type:ObjectIdSchema, default: new ObjectId()} 

你應該這樣做:

_id: {type:ObjectIdSchema, default: function() { return new ObjectId()} } 
+6

這是不必要的...如果不指定_id,默認爲ObjectId並創建自己 – wlingke 2014-06-15 23:08:11

+0

[錯誤:文檔在保存前必須有_id] – 2016-06-29 19:06:36

+0

此答案仍然有用,例如,子文檔沒有自動生成_id – 2017-02-21 11:31:18

5

添加auto標誌:

_id: { 
    type: mongoose.Schema.Types.ObjectId, 
    index: true, 
    required: true, 
    auto: true, 
    } 

source

相關問題