2015-08-08 75 views
0

假設簡單的模式:將邏輯添加到Mongoose的Model ctor中的最佳實踐是什麼?

var NestedSchema = mongooseSchema({ 
    'id' : Number, 
    'someData' : String 
}); 

var MySchema = mongoose.Schema({ 
    'exampleField' : [NestedSchema] 
}; 

我想不爲每個NestedSchema提供ID創建模型的實例,就像這樣:

new MySchemaModel({'exampleField' : [{'someData' : 'initial Data'}]}); 

我知道有pre-save掛鉤,讓我之前設置id場但這對我來說還不夠,因爲在我將模型實例保存在mongo中之前,我必須操作這些數據(並使用ID)。所以問題是:是否有很好的解決方案來包含一些pre-create函數來初始化在new之後被調用的數據?我在java託管的bean中尋找類似於PostConstruct方法的東西。

回答

0

你有一些奇怪的命名約定(我曾與camelCase教過,雖然最初來自PascalCase)和一種奇怪的問道。但我認爲你問的是「我創建時_id在哪裏?」,這個問題的答案是,它已經存在:

var async = require('async'), 
    mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var nestedSchema = new Schema({ 
    id: Number, 
    someData: String 
},{ "_id": false }); 

var mySchema = new Schema({ 
    exampleField: [nestedSchema] 
}); 

var MyModel = mongoose.model('MyModel', mySchema, 'mymodel'); 


var model = new MyModel(); 

console.log(model); 

將會產生類似:

{ _id: 55c61af0696bc49a29e4133e, exampleField: [] } 

因此,當您創建新實例,您保存或做任何事情,甚至在_id始終存在其他。

否則,如果你正在尋找你的嵌入式陣列項目定義一個「id」值,並明確「忽略它,就可以產生像我那麼做類似的默認_id

var nestedSchema = new Schema({ 
    id: { type: Number, default: genId() }, 
    someData: String 
},{ "_id": false }); 

genId()函數返回的是該字段的值,除非指定了這個值。所以「理想情況下」這裏的genId()函數做了類似於Create an autoincrementing sequence field中的記錄,並且每次調用新實例時都會用「syncronous」響應來分配一個全新的「id」值。

或者否則剛落,即場和接受貓鼬生成的默認_id值數組是這樣的:

var nestedSchema = new Schema({ 
    id: { type: Number, default: genId() }, 
    someData: String 
}); 

genId()是一個外部功能架構和bascially只是retuns被用作「缺省值「在創作時,沒有指定其他價值。這也發生在「保存之前」或任何其他操作,並且與對象的實例創建一樣簡單。

而之前之後的例子:

var async = require('async'), 
    mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var nestedSchema = new Schema({ 
    someData: String 
}); 

var mySchema = new Schema({ 
    exampleField: [nestedSchema] 
}); 

var MyModel = mongoose.model('MyModel', mySchema, 'mymodel'); 


var model = new MyModel({ "exampleField": [{ "someData": "here" }]}); 

console.log(model); 

主要生產:

{ _id: 55c633199f529d0b2a890dba, 
    exampleField: [ { someData: 'here', _id: 55c633199f529d0b2a890dbb } ] } 
+0

這個命名約定是從貓鼬的文檔中借用的,所以它可能很奇怪。我的問題不是'_id'字段,因爲我需要不同的編號方式,而不是已經在mongo中實現(但我提到過,不是嗎?)。無論如何 - 這不是一個答案。 –

+0

@DawidPura那麼問題是什麼?提到了什麼?我什麼也沒看見。不需要冒犯,因爲我沒有得罪。 –

+0

我編輯的問題,更準確地說,謝謝:) –

2

問題最初回答here通過Valeri Karpov - 非常感謝!

查看api文檔中的schema.queue函數,該函數使您能夠排隊每次創建新文檔時執行的函數。貓鼬在內部使用鉤子,但4.1。0正式補充說,面向公衆的API

要只是改換,貓鼬4.1.0正式支持schema.queue允許鉤子方法(尤其模式中聲明)來初始化鏈,所以sollution很簡單這裏:

MySchema.methods.generateIds = function() { 
    // app logic here 
} 

// ...and at last 
MySchema.queue('generateIds'); 

它會觸發generateIds ctor調用期間的方法!非常簡單而有趣。

相關問題