2012-01-24 8 views

risposta

46

metodi sono utilizzati per interagire con l'istanza corrente del modello. Esempio:

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

Statica vengono utilizzate quando non si vuole interagire con un'istanza, ma fare cose del modello relative (per esempio ricerca di tutti gli animali di nome 'Rover').

Se si desidera inserire/aggiornare un'istanza di un modello (nel db), quindi methods sono la strada da percorrere. Se hai solo bisogno di salvare/aggiornare roba puoi usare la funzione save (già esistente in Mongoose). Esempio:

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

Ma come avrei potuto fare 'dog.save()' all'interno di un metodo? – Industrial

+4

'this.save()', poiché 'this' farebbe riferimento a' dog' – alessioalex

+3

@alessioalex - Ho notato che questo è simile all'esempio nei documenti mongoose, tuttavia rispettano il tipo come: 'return this.model ('Animal ') .find ({type: this.type}, cb); 'Non ho mai capito perché dobbiamo usare' model (' Animal ') 'qui, dato che stiamo aggiungendo questo metodo allo schema Animal. Presumibilmente è opzionale quindi - sai perché è scritto così nei documenti? – UpTheCreek

55

Da dentro un metodo statico, è anche possibile creare un nuovo documento facendo:

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

Ho finito per fare anche questo - qualcosa mi infastidisce comunque nel creare un nuovo this(), e non sono sicuro di cosa fare al riguardo. Qualcun altro ha un bel modo per farlo? – basicallydan

+0

se si dispone di: var model = bla bla prima della statica, è possibile eseguire il nuovo modello() al suo interno, poiché è a portata di mano –

+1

Grazie mille. Solo una cosa nel mio caso: se si tenta di usare 'this' all'interno di una query mangusta, verrà puntato il' this' di questa query, non il 'this' dell'istanza statica. Questo era il mio problema –

1

Non pensare è necessario creare una funzione che .save chiama(). Tutto ciò che è necessario fare prima che il modello viene salvato può essere fatto utilizzando .pre()

Se si desidera che il controllo se è stato creato il modello o aggiornato fare un controllo per this.isNew()

Problemi correlati