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


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' })


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

30

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

mongoose.pluralize(null);

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');

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;

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 .



-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()!


odtwarzasz problem?
Pedro JR
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.