2012-01-24 16 views

Respuesta

46

métodos se utilizan para interactuar con la instancia actual del modelo. Ejemplo:

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

Estática se utilizan cuando no se desea interactuar con una instancia, pero hace cosas relacionadas con modelo (por ejemplo, búsqueda de todos los animales llamados 'Rover').

Si desea insertar/actualizar una instancia de un modelo (en la base de datos), entonces methods es el camino a seguir. Si solo necesita guardar/actualizar cosas, puede usar la función save (ya existente en Mongoose). Ejemplo:

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

Pero, ¿cómo podía hacer 'dog.save()' desde dentro de un método? – Industrial

+4

'this.save()', ya que 'this' se referiría a' perro' – alessioalex

+3

@alessioalex - Observo que esto es similar al ejemplo en los documentos de mangosta, sin embargo, se vuelve a especificar el tipo: 'return this.model ('Animal ') .find ({type: this.type}, cb); 'Nunca he entendido por qué tenemos que usar' model (' Animal ') 'aquí, ya que estamos agregando este método al esquema Animal. Presumiblemente es opcional entonces, ¿sabes por qué está escrito así en los documentos? – UpTheCreek

55

Desde el interior de un método estático, también se puede crear un nuevo documento haciendo:

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

Terminé haciendo esto también - algo me molesta sobre crear un nuevo esto() sin embargo, y no estoy seguro de qué hacer al respecto. ¿Alguien más tiene una buena manera de hacer esto? – basicallydan

+0

si tiene: var modelo = bla bla antes de la estática, puede hacer un nuevo modelo() dentro de ella, ya que está dentro del alcance –

+1

Muchas gracias. Solo una cosa en mi caso: si intentas usar 'this' dentro de una consulta de mangosta, señalará el' this' de esta consulta, no el 'this' de la instancia estática. Ese fue mi problema –

1

no creo que se necesita para crear una función que llama .save(). Cualquier cosa que usted necesita hacer antes de que el modelo se guarda se puede hacer usando .pre()

Si desea que el cheque si se está creando el modelo o actualiza hacer un cheque por this.isNew()

Cuestiones relacionadas