web-dev-qa-db-fra.com

Méthodes Mongoose 'statiques' vs méthodes 'instance'

Je crois que cette question est similaire à celle-ci mais la terminologie est différente. De la Mongoose 4 documentation :

Nous pouvons également définir nos propres méthodes d'instance de document personnalisées.

// define a schema
var animalSchema = new Schema({ name: String, type: String });

// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}

Désormais, toutes nos instances animales disposent d'une méthode findSimilarTypes.

Et alors:

L'ajout de méthodes statiques à un modèle est également simple. Continuant avec notre animalSchema:

// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
}

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
  console.log(animals);
});

Il semble qu'avec les méthodes statiques, chacune des instances animales disposerait également de la méthode findByName. Que sont les objets statics et methods dans un schéma? Quelle est la différence et pourquoi devrais-je utiliser l'un sur l'autre?

39
Startec

statics sont les méthodes définies dans le modèle. methods sont définis sur le document (instance).

Vous pourriez faire

Animal.findByName('fido', function(err, fido){
    // fido => { name: 'fido', type: 'dog' }
});

Et puis vous pouvez utiliser l'instance de document fido pour le faire 

fido.findSimilarTypes(function(err, dogs){
    // dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ]
});
53
laggingreflex

La logique de la base de données doit être encapsulée dans le modèle de données. Mongoose fournit 2 façons de procéder, méthodes et statique. Méthodes ajoute une méthode d'instance aux documents, tandis que Statics ajoute des méthodes statiques «de classe» aux modèles eux-mêmes. Le mot clé static définit une méthode statique pour un modèle. Les méthodes statiques ne sont pas appelées sur les instances du modèle. Au lieu de cela, ils sont appelés sur le modèle lui-même. Ce sont souvent des fonctions utilitaires, telles que des fonctions pour créer ou cloner des objets. comme exemple ci-dessous:

const bookSchema = mongoose.Schema({
  title: {
    type : String,
    required : [true, 'Book name required']
  },
  publisher : {
    type : String,
    required : [true, 'Publisher name required']
  },
  thumbnail : {
    type : String
  }
  type : {
    type : String
  },
  hasAward : {
    type : Boolean
  }
});

//method
bookSchema.methods.findByType = function (callback) {
  return this.model('Book').find({ type: this.type }, callback);
};

// statics
bookSchema.statics.findBooksWithAward = function (callback) {
  Book.find({ hasAward: true }, callback);
};

const Book = mongoose.model('Book', bookSchema);
export default Book;

pour plus d'informations: https://osmangoni.info/posts/separating-methods-schema-statics-mongoose/

0
MR EXCEL