7 März 2025 (updated: 7 März 2025)

Mongoose vs Typegoose in NestJS

Chapters

      Nachdem Sie die MongoDB-Datenbank in Ihrem System ausgewählt haben, werden Sie wahrscheinlich auch eine ODM-Bibliothek verwenden. Die beliebteste ist Mongoose oder eine darauf basierende Bibliothek - Typegoose. In diesem Artikel werden wir die Hauptunterschiede beim Arbeiten speziell mit dem NestJS-Framework behandeln.

      Sie wissen wahrscheinlich bereits, dass Typegoose im Wesentlichen eine Möglichkeit ist, Mongoose mit TypeScript zu verwenden, und das wäre Ihr Kriterium bei der Auswahl der Bibliothek. Aber es gibt noch etwas mehr zu beachten, wenn Sie mit dem NestJS-Framework arbeiten, da es einen Mongoose-Wraper gibt, der von den Autoren von NestJS erstellt wurde - @nestjs/mongoose, und wenn Sie sich die Syntax ansehen - sie scheint fast identisch mit Typegoose zu sein.

      Lassen Sie uns die Unterschiede zwischen ihnen aufschlüsseln, damit es einfacher wird, zu entscheiden, welchen Ansatz Sie in Ihrem Projekt wählen sollten - die Verwendung des @nestjs/mongoose-Pakets oder Typegoose. Bei der Integration von MongoDB mit einer NestJS-Anwendung finden Sie Beispiele und Code-Snippets, die zeigen, wie man eine NestJS-Anwendung einrichtet, um mit MongoDB unter Verwendung von TypeScript und Paketen wie Typegoose zu arbeiten.

      Hauptunterschiede

      Verbindung und Modellinjektion mit MongoDB-Datenbank

      @nestjs/mongoose ist eine Bibliothek, die dem Nest-Framework gewidmet ist, und bietet daher volle Unterstützung für seinen DI-Workflow. Andererseits kann Typegoose in jedem anderen NodeJS-Projekt verwendet werden, sodass Sie es entweder selbst in Nest integrieren oder Community-Pakete verwenden müssen.

      Schema-Definition

      Obwohl beide Pakete die Definition von Schemata mit ähnlichen Dekoratoren ermöglichen, variieren ihre Schnittstellen und Typegoose bietet mehr Optionen als der Nest-Wrapper. Zum Beispiel - der `@Schema()` Dekorator akzeptiert nur die von Mongoose definierten Schema-Optionen, während `@modelOptions()` zusätzlich dazu Zugriff auf eine bestehende Verbindung und einige benutzerdefinierte Typegoose-Konfigurationsoptionen bietet.

      Mit `@nestjs/mongoose`, wenn Sie die Schema-Definition manuell basierend auf den Metadaten ändern möchten, können Sie die Klasse `DefinitionsFactory` verwenden. Dieser Ansatz kann nützlich sein, wenn es schwierig ist, alles mit Dekoratoren darzustellen.

      Klassenmethoden

      Beide Pakete ermöglichen die Definition von Instanz- und statischen Methoden. Hier sind Beispiele, wie wir Klassenmethoden in beiden Paketen definieren können:

      Wie Sie sehen können, müssen wir zusätzliche Schnittstellen erstellen, wenn wir mongoose verwenden. Typegoose hingegen ermöglicht es uns, Typinformationen aus Klassen zu erhalten. Die Definitionen sind auch natürlicher, da sie innerhalb einer Klasse wie reguläre Methoden enthalten sind. Mit dem Nest-Paket müssen Sie die Eigenschaften `statics` und `methods` außerhalb der Klasse verwenden, was die Lesbarkeit leicht verringert und einen weniger natürlichen Ansatz beim Arbeiten mit Klassen darstellt.

      Hooks

      Beide Pakete unterstützen Hooks. In @nestjs/mongoose können Sie sie in der Fabrikmethode der Modulimporte verwenden. Typegoose bietet Unterstützung mit den Dekoratoren @pre() und @post().

      Benutzerdefinierte Abfragemethoden

      Sie können benutzerdefinierte Abfragen in beiden Paketen hinzufügen, aber Sie werden wahrscheinlich auf Typprobleme in Mongoose stoßen. Der Unterschied zwischen einer Abfragemethode und einer statischen Funktion im Modell besteht darin, dass die Funktion nicht verkettbar wäre.

      Virtuelle

      Virtuelle Eigenschaften können in Typegoose mit ES6 get & set Funktionen erstellt werden, während man mit dem Nest-Paket die `virtual` Eigenschaft außerhalb der Klasse verwenden muss, was ähnlich wie Klassenmethoden weniger natürlich zu handhaben ist.

      Welche sollten Sie wählen?

      Obwohl Mongoose bereits Typen aus der Schema-Definition ableiten kann und sein Nest-Wrapper coole Funktionen hat, profitieren Sie dennoch mehr von der Verwendung von Typegoose. Es hat auch eine bessere Dokumentation und Community-Unterstützung. Die Frage ist - haben Sie die Zeit und Ressourcen, um Typegoose in Ihr Nest-Projekt zu integrieren? Wenn ja, würde ich persönlich ihm eine Chance geben.

      Schau dir auch an

      Paweł Sierant

      Backend Developer

      Vielleicht ist das Anfang einer wunderbaren Freundschaft?

      Wir sind für neue Projekte verfügbar.

      Contact us