Почему мангуст всегда добавляет букву s в конце названия моей коллекции

120

Например, этот код приводит к созданию коллекции под названием «данные».

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

И этот код приводит к созданию коллекции под названием "пользователи".

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

Спасибо

Боб Рен
источник
3
Это соглашение в Rails. У вас есть объект «пользователь», вы храните его в коллекции «пользователи». Думаю, то же самое и с Mongoose.
Серджио Туленцев
Да, достаточно интересно var Dataset = mongoose.model ('datas', dataSchema); приводит к коллекции, называемой данными.
Боб Рен
Кажется, что плюрализирующая логика не так уж глупа (или умна, зависит от того, чего вы ожидали). Я уверен, что вы сможете узнать, как именно это работает (найдите источник).
Серджио Туленцев
2
@SergioTulentsev, это не рубин, но он работает точно так же github.com/LearnBoost/mongoose/blob/master/lib/utils.js
7
Только для записи. Данные во множественном числе, данные в единственном числе - это данные
Луис Сейра

Ответы:

199

Mongoose пытается быть умным, делая имя вашей коллекции множественным числом. Однако вы можете заставить его быть тем, что хотите:

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

Aaronheckmann
источник
31
Я не понимаю, как добавление буквы «s» делает структуру более умной, ИМХО, это плохая идея. Кроме того, мангуст - отличный фреймворк.
Роберто
14
это старый плохой выбор, который нарушает обратную совместимость, если его вынуть. поэтому мы решили придерживаться этого.
aaronheckmann
18
он не просто добавляет букву «s», а дает правильное множественное число имени. Попробуйте для экземпляров с помощью «mouse» вы получите коллекцию с именем «mice» или с «person» вы получите «people». Это
сводило
3
Это очень безумие, какое имя вы используете для запроса своей коллекции, особенно когда вам нужно сделать это из другого интерфейса?
Xsmael 01
8
Я был в ужасе, потому что я определил «кисть» и там была коллекция под названием «кисти». Я почти полчаса пытался найти, где это определил, и ничего не нашел. Я подумал: «Может быть, это умно и добавляет это. Возможно, нет, но давайте посмотрим .... ФУУУУУУУ»
Фуссельдиб 01
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

Начиная с mongoose 5.x вы можете полностью отключить его:

mongoose.pluralize(null);
Андрей Хохуткин
источник
Лучшее решение, потому что нам не нужно определять имя модели и имя коллекции.
Nezih
Это определенно лучший подход.
netishix
1
Мне потребовалось несколько часов, чтобы узнать об этой хитрости Мангуста. В любом случае - рад, что нашел это решение. Кстати: он также избегает автоматического нижнего регистра имен коллекций.
Бернхард Фюрст,
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;
Sebu
источник
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")

Предполагая, что ваше состояние - это то, что вы хотите использовать в своей базе данных, чтобы избежать s как состояний

Щелкните ссылку, чтобы просмотреть изображение правильно

Педро-младший
источник
-2

Когда вы запускаете эту команду, Mongoose компилирует для вас модель

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

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

Примечание:.model() функция делает копию схемы. Перед вызовом убедитесь, что вы добавили в схему все, что хотите, включая хуки .model()!

Кушагра
источник
вы воссоздаете проблему?
Педро-младший,