Warum fügt Mungo immer ein s am Ende meines Sammlungsnamens hinzu?


120

Dieser Code führt beispielsweise dazu, dass eine Sammlung mit dem Namen "Daten" erstellt wird

var Dataset = mongoose.model('data', dataSchema);

Und dieser Code führt dazu, dass eine Sammlung namens "Benutzer" erstellt wird

var User = mongoose.model('user', dataSchema);

Vielen Dank


3
Es ist die Konvention in Rails. Sie haben das Objekt "Benutzer", Sie speichern es in der Sammlung "Benutzer". Bei Mongoose ist es wohl genauso.
Sergio Tulentsev

Ja, interessanterweise var Dataset = mongoose.model ('datas', dataSchema); führt zu einer Sammlung namens Daten.
Bob Ren

Scheint, dass die Pluralisierungslogik nicht so dumm ist (oder klug, hängt davon ab, was Sie erwartet haben). Ich bin sicher, Sie können herausfinden, wie es genau funktioniert (finden Sie die Quelle).
Sergio Tulentsev

2
@SergioTulentsev, das ist kein Rubin, aber es funktioniert auf die gleiche Weise github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
Nur für das Protokoll. Daten sind Plural, Singular von Daten ist Datum
Luis Sieira

Antworten:


198

Mungo versucht klug zu sein, indem er Ihren Sammlungsnamen pluralisiert. Sie können es jedoch erzwingen, was immer Sie wollen:

var dataSchema = new Schema({..}, { collection: 'data' })


31
Ich verstehe nicht, wie das Hinzufügen eines "s" das Framework intelligenter macht, IMHO, das ist eine schlechte Idee. Abgesehen davon ist Mungo ein großartiger Rahmen.
Roberto

14
Es ist eine alte schlechte Wahl, die die Abwärtskompatibilität bricht, wenn sie herausgenommen wird. Also haben wir uns entschieden, dabei zu bleiben.
Aaronockmann

18
Es wird nicht nur ein 's' hinzugefügt, sondern es wird der korrekte Plural des Namens erstellt. Versuchen Sie es beispielsweise mit "Maus", Sie erhalten eine Sammlung mit dem Namen "Mäuse" oder mit "Person" erhalten Sie "Personen". Es hat mich verrückt gemacht zu verstehen, woher diese Namen kamen :-)
Enrico Giurin

3
Das ist jetzt sehr verrückt. Welchen Namen verwenden Sie, um Ihre Sammlung abzufragen, insbesondere wenn Sie dies über eine andere Schnittstelle tun müssen?
Xsmael

8
Ich bin ausgeflippt, weil ich "Pinsel" definiert habe und es eine Sammlung mit dem Namen "Pinsel" gab. Ich versuchte fast eine halbe Stunde lang herauszufinden, wo ich das definiert hatte, und fand nichts. Ich dachte: "Vielleicht ist es klug und fügt das hinzu. Wahrscheinlich nicht, aber lasst uns ... FUUUUUUU"
Fusseldieb

49

Die API-Struktur von mongoose.model lautet wie folgt:

Mongoose#model(name, [schema], [collection], [skipInit])

Was Mungo tut, ist, dass Mongoose, wenn kein Sammlungsargument übergeben wird, einen Sammlungsnamen durch Pluralisieren des Modellnamens erzeugt. Wenn Ihnen dieses Verhalten nicht gefällt, übergeben Sie entweder einen Sammlungsnamen oder legen Sie die Option Name der Schemasammlung fest.

Beispiel:

var schema = new Schema({ name: String }, { collection: 'actor' });

oder

schema.set('collection', 'actor');

oder

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);

30

Ab Mungo 5.x können Sie es vollständig deaktivieren:

mongoose.pluralize(null);

Beste Lösung, da wir nicht sowohl den Modellnamen als auch den Sammlungsnamen definieren müssen.
Nezih

Dies ist definitiv der beste Ansatz.
Netishix

1
Ich habe einige Stunden gebraucht, um etwas über diese Art von Schlauheit des Mungos zu lernen. Wie auch immer - ich bin froh, dass ich diese Lösung gefunden habe. Übrigens: Es wird auch vermieden, dass Sammlungsnamen automatisch im unteren Gehäuse geschrieben werden.
Bernhard Fürst

8

Sie können einfach eine Zeichenfolge als drittes Argument hinzufügen, um den tatsächlichen Namen für die Sammlung zu definieren. Erweitern Sie Ihre Beispiele zu halten , Namen wie dataund userjeweils:

var Dataset = mongoose.model('data', dataSchema, 'data');

var User = mongoose.model('user', dataSchema, 'user');

2

Sie können den Sammlungsnamen als dritten Parameter hinzufügen. Siehe das Beispiel mit Typescript:

import DataAccess = require('../DataAccess');
import IUser = require("../../Models/Interfaces/IUser");

var mongoose = DataAccess.mongooseInstance;
var mongooseConnection = DataAccess.mongooseConnection;

class UserSchema {
        static get schema () {
        var schema =  mongoose.Schema({
            _id : {
                type: String
            },
            Name: {
                type: String,
                required: true
            },
            Age: {
                type: Number,
                required: true
            }
        });

        return schema;
    }
}
var schema:any = mongooseConnection.model<IUser>("User", 
UserSchema.schema,"User");
export = schema;

2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

Zeile hinzufügenmongoose.pluralize(null) in Ihrer Mongoose-Datei wird die Pluralisierung des Sammlungsnamens verhindert. Sie müssen diese Zeile nicht zu Ihren Modelldateien hinzufügen.

Wie hier zu sehen .



-2

Mongoose kompiliert ein Modell für Sie, wenn Sie diesen Befehl ausführen

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var child = mongoose.model('child', schema);

Das erste Argument ist der singuläre Name der Sammlung, für die Ihr Modell bestimmt ist. Mungo sucht automatisch nach der Pluralversion Ihres Modellnamens in Kleinbuchstaben . Für das obige Beispiel ist das untergeordnete Modell daher für die untergeordnete Sammlung in der Datenbank vorgesehen.

Hinweis: Die .model()Funktion erstellt eine Kopie des Schemas. Stellen Sie sicher, dass Sie vor dem Aufruf alles hinzugefügt haben, was Sie zum Schema hinzufügen möchten, einschließlich Hooks .model()!


Sie erstellen das Problem neu?
Pedro JR
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.