it-swarm.com.de

Mongoose 'statische' Methoden vs. 'Instanz'-Methoden

Ich glaube, diese Frage ähnelt diesem , aber die Terminologie ist anders. Aus dem Mungo 4 Dokumentation :

Wir können auch unsere eigenen benutzerdefinierten Dokumentinstanzmethoden definieren.

// 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);
}

Jetzt steht allen unseren Tierinstanzen eine findSimilarTypes-Methode zur Verfügung.

Und dann:

Das Hinzufügen statischer Methoden zu einem Modell ist ebenfalls einfach. Weiter mit unserem 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);
});

Es scheint, dass mit statischen Methoden für jede der Tierinstanzen auch die findByName-Methode verfügbar wäre. Was sind die statics- und methods-Objekte in einem Schema? Was ist der Unterschied und warum sollte ich eins über das andere verwenden?

39
Startec

statics sind die im Modell definierten Methoden. methods sind im Dokument (Instanz) definiert.

Das könntest du tun

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

Dann könnten Sie die Dokumentinstanz fido verwenden 

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

Die Datenbanklogik sollte im Datenmodell eingeschlossen sein. Mongoose bietet zwei Möglichkeiten, Methoden und Statik. Methods fügt Dokumenten eine Instanzmethode hinzu, während Statics den Models selbst statische Klassenmethoden hinzufügt. Das statische Schlüsselwort definiert eine statische Methode für ein Modell. Statische Methoden werden für Instanzen des Modells nicht aufgerufen. Stattdessen werden sie für das Modell selbst aufgerufen. Dies sind häufig Hilfsfunktionen, z. B. Funktionen zum Erstellen oder Klonen von Objekten. wie Beispiel unten:

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;

für weitere Informationen: https://osmangoni.info/posts/separating-methods-schema-statics-mongoose/

0
MR EXCEL