2012-01-24 1 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に存在します)を使用することができます。例:

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

しかし、私はどのように行うことができますメソッド内から 'dog.save()'? 'this'は' dog'を参照するので、 – Industrial

+4

'this.save()'です。 – alessioalex

+3

@alessioalex - これはmongoose docsの例と似ていますが、タイプを再指定します: 'return this.model( 'Animal ').find({type:this.type}、cb); 'このメソッドをAnimalスキーマに追加するので、なぜここで' model(' Animal ') 'を使用しなければならないのか理解できませんでした。おそらくそれはオプションです - あなたはなぜそれがドキュメントのように書かれているのか分かりますか? – UpTheCreek

55

静的メソッド内から、あなたも行うことで、新しいドキュメントを作成することができます。モデルが作成または更新されている場合はチェックをしたい場合は、モデルが保存される前に行う必要があるものは.pre()

を使用して行うことができるthis.isNewのチェックを(行う)

+2

私もこれをやってしまいました。新しいものを作成することについて何か気になりますが、それについて何をすべきか分かりません。他の誰かがこれを行う良い方法がありますか? – basicallydan

+0

あなたは: varモデル= bla bla静的の前に、新しいモデル()を内部に置くことができます。届く範囲内にあるので –

+1

ありがとうございます。私の場合、ちょうど1つのこと:mongooseクエリで 'this 'を使用しようとすると、静的インスタンスの' this'ではなく、このクエリの 'this'を指し示します。それが私の問題でした。 –

1

あなたは().SAVEを呼び出す関数を作成する必要があると思うしないでください。

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; 
    }); 
}); 
関連する問題