2012-01-24 144 views

回答

46

方法用於與模型的當前實例進行交互。例如:

var AnimalSchema = new Schema({ 
    name: String 
    , type: String 
}); 

// we want to use this on an instance of Animal 
AnimalSchema.methods.findSimilarType = function findSimilarType (cb) { 
    return this.find({ type: this.type }, cb); 
}; 

var Animal = mongoose.model('Animal', AnimalSchema); 
var dog = new Animal({ name: 'Rover', type: 'dog' }); 

// dog is an instance of Animal 
dog.findSimilarType(function (err, dogs) { 
    if (err) return ... 
    dogs.forEach(..); 
}) 

靜使用,當你不想與一個實例交互,但這些模型相關的東西(例如搜索名爲「羅孚」的所有動物)。

如果要插入/更新模型(進入DB)的一個實例,然後methods是要走的路。如果你只需要保存/更新東西,你可以使用save函數(已經存在於Mongoose中)。例如:

var Animal = mongoose.model('Animal', AnimalSchema); 
var dog = new Animal({ name: 'Rover', type: 'dog' }); 
dog.save(function(err) { 
    // we've saved the dog into the db here 
    if (err) throw err; 

    dog.name = "Spike"; 
    dog.save(function(err) { 
    // we've updated the dog into the db here 
    if (err) throw err; 
    }); 
}); 
+2

一個檢查,但我怎麼能這樣做從一個方法內的'dog.save()'? – Industrial

+4

'this.save()','因爲將this'指'dog' – alessioalex

+3

@alessioalex - 我注意到這類似於在礦井貓鼬文檔的例子,但他們respecify喜歡的類型:'返回this.model(「動物').find({type:this.type},cb);'我從來不明白爲什麼我們必須在這裏使用'model'('Animal')',因爲我們將這個方法添加到Animal模式中。據推測這是可選的 - 你知道爲什麼它是這樣寫在文檔中嗎? – UpTheCreek

55

從靜態方法中,你也可以通過做創建一個新文件:

schema.statics.createUser = function(callback) { 
    var user = new this(); 
    user.phone_number = "jgkdlajgkldas"; 
    user.save(callback); 
}; 
+2

我也這樣做了 - 有些事情讓我困擾於創建一個新的this(),但我不知道該怎麼做。有沒有其他人有一個很好的方法來做到這一點? – basicallydan

+0

如果你有: var model = bla bla之前的靜態,你可以在裏面做新模型(),因爲它的範圍可以達到 –

+1

非常感謝。在我的情況下只有一件事:如果你嘗試在貓鼬查詢中使用'this',它將指向這個查詢的this,而不是這個靜態實例的this。那是我的問題。 –

1

不要認爲你需要創建一個調用.save()的函數。你需要做之前,模型保存可以用.pre()

如果你想檢查來完成,如果在創建模型或更新任何做this.isNew()