Dlaczego mangusta zawsze dodaje s na końcu nazwy mojej kolekcji

120

Na przykład ten kod skutkuje utworzeniem kolekcji o nazwie „dane”

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

Ten kod skutkuje utworzeniem kolekcji o nazwie „użytkownicy”

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

Dzięki

Bob Ren
źródło
3
Taka jest konwencja w Railsach. Masz obiekt „user”, przechowujesz go w kolekcji „users”. Chyba tak samo jest w Mongoose.
Sergio Tulentsev
Tak, co ciekawe var Dataset = mongoose.model ('datas', dataSchema); daje w wyniku zbiór o nazwie datas.
Bob Ren
Wydaje się, że logika liczby mnogiej nie jest aż tak głupia (lub inteligentna, zależy od tego, czego się spodziewałeś). Jestem pewien, że możesz dowiedzieć się, jak to dokładnie działa (znajdź źródło).
Sergio Tulentsev
2
@SergioTulentsev, czyli nie ruby, ale działa w ten sam sposób github.com/LearnBoost/mongoose/blob/master/lib/utils.js
7
Tak dla porządku. Dane są w liczbie mnogiej, liczba pojedyncza jest datum
Luis Sieira

Odpowiedzi:

200

Mongoose stara się być sprytny, używając liczby mnogiej nazwy kolekcji. Możesz jednak zmusić go do tego, co chcesz:

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

aaronheckmann
źródło
31
Nie rozumiem, jak dodanie „s” sprawia, że ​​framework jest bardziej inteligentny, IMHO, to zły pomysł. Poza tym mongoose to niesamowity framework.
Roberto,
14
to stary, kiepski wybór, który po wyjęciu łamie kompatybilność wsteczną. więc zdecydowaliśmy się go trzymać.
aaronheckmann
18
nie tylko dodaje „s”, ale tworzy poprawną liczbę mnogą nazwy. Wypróbuj instancje za pomocą „myszy”, a otrzymasz kolekcję o nazwie „myszy” lub „osoba”, aby uzyskać „ludzi”.
Doprowadzało
3
To bardzo szalone, której nazwy używasz do wysyłania zapytań do swojej kolekcji, szczególnie gdy musisz to zrobić z innego interfejsu?
Xsmael
8
Szalałem, bo zdefiniowałem „pędzel” i była kolekcja o nazwie „pędzle”. Próbowałem znaleźć miejsce, w którym to zdefiniowałem przez prawie pół godziny i nic nie znalazłem. Pomyślałem: „Może to sprytne i to dodam. Prawdopodobnie nie, ale zobaczmy… FUUUUUUU”
Fusseldieb
49

Struktura API modelu mongoose.model jest następująca:

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

Mongoose robi to, gdy nie jest przekazywany żaden argument kolekcji, Mongoose tworzy nazwę kolekcji, używając liczby mnogiej nazwy modelu. Jeśli nie podoba ci się to zachowanie, przekaż nazwę kolekcji lub ustaw opcję nazwy kolekcji schematów.

Przykład:

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

lub

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

lub

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);
Nishank Singla
źródło
30

Począwszy od Mongoose 5.x, możesz go całkowicie wyłączyć:

mongoose.pluralize(null);
Andrey Hohutkin
źródło
Najlepsze rozwiązanie, ponieważ nie musimy definiować zarówno nazwy modelu, jak i nazwy kolekcji.
Nezih
To zdecydowanie najlepsze podejście.
netishix
1
Zajęło mi kilka godzin, zanim nauczyłem się tego rodzaju sprytu Mongoose. Zresztą - cieszę się, że znalazłem to rozwiązanie. A tak przy okazji: unika również automatycznego zamykania małych liter w nazwach kolekcji.
Bernhard Fürst
8

Możesz po prostu dodać ciąg jako trzeci argument, aby zdefiniować rzeczywistą nazwę kolekcji. Rozszerzając przykłady, aby zachować nazwy jako odpowiednio datai user:

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

var User = mongoose.model('user', dataSchema, 'user');
Andrea
źródło
2

Możesz dodać nazwę kolekcji jako trzeci parametr. Zobacz przykład przy użyciu 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
źródło
2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

Dodanie linii mongoose.pluralize(null)do pliku Mongoose zapobiegnie tworzeniu liczby mnogiej nazw kolekcji. Nie musisz dodawać tej linii do plików modelu.

Jak widać tutaj .

Daniel Segura
źródło
1

Pod koniec definiowania schematu w następnej linii Użyj tego kodu

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

Zakładając, że Twój stan jest tym, czego chcesz użyć na swojej bazie danych, aby uniknąć stanów jako stanów

Kliknij łącze, aby prawidłowo wyświetlić obraz

Pedro JR
źródło
-2

Mongoose kompiluje model dla Ciebie po uruchomieniu tego polecenia

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

Pierwszym argumentem jest pojedyncza nazwa kolekcji, dla której przeznaczony jest model. Mongoose automatycznie szuka liczby mnogiej, małej wersji nazwy modelu. Dlatego w powyższym przykładzie model potomny jest przeznaczony dla kolekcji dzieci w bazie danych.

Uwaga:.model() funkcja tworzy kopię schematu. Upewnij się, że dodałeś wszystko, co chcesz do schematu, w tym hooki, zanim zadzwonisz .model()!

Kushagra
źródło
odtwarzasz problem?
Pedro JR