Чому мангуст завжди додає s в кінець моєї назви колекції


120

Наприклад, цей код призводить до створення колекції під назвою "дані"

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

І за допомогою цього коду створюється колекція під назвою "користувачі"

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

Дякую


3
Це конвенція в Rails. У вас є об'єкт "користувач", ви зберігаєте його в колекції "користувачів". Так само і в Мангузі.
Серхіо Туленцев

Так, досить цікаво var Dataset = mongoose.model ('datas', dataSchema); приводить до колекції під назвою дані.
Боб Рен

Здається, що плюралізація логіки не є такою німою (чи розумною, залежить від того, що ви очікували). Я впевнений, що ви можете дізнатися, як це працює саме (знайдіть джерело).
Серхіо Туленцев

2
@SergioTulentsev, це не рубін, але він працює так само, як github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
Просто для запису. Дані множини, однини даних - це дата
Луїс Сієра

Відповіді:


200

Мангуст намагається бути розумним, роблячи назву колекції множиною. Однак ви можете змусити його бути будь-яким, що вам захочеться

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


31
Я не розумію, як додавання "s" робить основу більш розумною, IMHO, це погана ідея. Крім того, що мангуста є дивовижною основою.
Роберто

14
це старий поганий вибір, який порушує сумісність, якщо вийняти. тому ми вирішили дотримуватися цього.
aaronheckmann

18
він не просто додає "s", але робить правильну множину імені. Спробуйте для екземплярів з "мишкою", ви отримаєте колекцію з назвою "миші" або з "людина" ви отримаєте "люди". Мене
зводило з

3
Зараз це дуже божевільно, яке ім'я ви використовуєте, щоб запитувати свою колекцію еспічно, коли вам потрібно це зробити з іншого інтерфейсу?
Xsmael

8
Я відлякав, бо я визначив "пензлик" і там була колекція з назвою "пензлі". Я майже півгодини намагався знайти, де я це визначив, і нічого не знайшов. Я подумав: "Може бути, це розумно і додає це. Мабуть, ні, але давайте .... FUUUUUUUU"
Fusseldieb

49

Структура API mongoose.model така:

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

Що мангуста робити, це те, що, коли жоден аргумент колекції не передається, Mongoose створює ім'я колекції шляхом множення імені моделі. Якщо вам не подобається така поведінка, або передайте ім'я колекції або встановіть опцію назви колекції схем.

Приклад:

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

або

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

або

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

30

Починаючи з мангуста 5.x, ви можете повністю відключити його:

mongoose.pluralize(null);

Найкраще рішення, тому що нам не потрібно визначати як назву моделі, так і назву колекції.
Незіх

Це, безумовно, найкращий підхід.
netishix

1
Знадобилося кілька годин, щоб дізнатися про таку кмітливість мангуста. У всякому разі - рада, що знайшла таке рішення. BTW: Це також дозволяє уникнути автоматичного нижнього розміщення назв колекцій.
Бернхард Фюрст

8

Ви можете просто додати рядок як третій аргумент, щоб визначити фактичну назву колекції. Розширюючи свої приклади, щоб зберегти імена як dataі userвідповідно:

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

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

2

Ви можете додати ім'я колекції як третій параметр. Дивіться приклад за допомогою 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);

Додавання рядка mongoose.pluralize(null)у файл Mongoose запобіжить множинні назви колекції. Вам не потрібно додавати цей рядок до файлів вашої моделі.

Як видно тут .


1

Наприкінці визначення схеми у наступному рядку Використовуйте цей код

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

Якщо припустити, що ваш стан - це те, що ви хочете використовувати на своєму db, щоб уникнути s як держави

Клацніть посилання, щоб переглянути зображення належним чином


-2

Mongoose компілює модель для вас під час виконання цієї команди

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

Перший аргумент - це особлива назва колекції, для якої ваша модель. Mongoose автоматично шукає множину нижньої літери версії імені вашої моделі. Таким чином, для прикладу, наведеного вище, модель дитини є для дітей, що збирається в базі даних.

Примітка . .model()Функція робить копію схеми. Переконайтесь, що ви додали все, що ви хочете до схеми, включаючи гачки, перед тим, як дзвонити .model()!


ти відтворюєш проблему?
Педро JR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.