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

Bob Ren
quelle
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' })

aaronheckmann
quelle
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);
Nishank Singla
quelle
30

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

mongoose.pluralize(null);
Andrey Hohutkin
quelle
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');
Andrea
quelle
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;
sebu
quelle
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 .

Daniel Segura
quelle
1

Am Ende der Definition Ihres Schemas in der nächsten Zeile Verwenden Sie diesen Code

module.exports = mongoose.model("State", "StateSchema", "state")

Angenommen, Ihr Status ist das, was Sie auf Ihrer Datenbank verwenden möchten, um s als Status zu vermeiden

Klicken Sie auf den Link, um das Bild richtig anzuzeigen

Pedro JR
quelle
-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()!

Kushagra
quelle
Sie erstellen das Problem neu?
Pedro JR