¿Por qué Mongoose siempre agrega una s al final del nombre de mi colección?

120

Por ejemplo, este código da como resultado la creación de una colección llamada "datos".

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

Y este código da como resultado una colección llamada "usuarios" que se crea

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

Gracias

Bob Ren
fuente
3
Es la convención en Rails. Tiene el objeto "usuario", lo almacena en la colección "usuarios". Es lo mismo en Mongoose, supongo.
Sergio Tulentsev
Sí, curiosamente var Dataset = mongoose.model ('datas', dataSchema); da como resultado una colección llamada datas.
Bob Ren
Parece que pluralizar la lógica no es tan tonto (o inteligente, depende de lo que esperabas). Estoy seguro de que puede averiguar cómo funciona exactamente (busque la fuente).
Sergio Tulentsev
2
@SergioTulentsev, eso no es ruby, pero funciona de la misma manera github.com/LearnBoost/mongoose/blob/master/lib/utils.js
7
Para que conste. Los datos son plural, singular de datos es datum
Luis Sieira

Respuestas:

200

Mongoose está tratando de ser inteligente haciendo que el nombre de su colección sea plural. Sin embargo, puedes forzarlo a que sea lo que quieras:

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

Aaronheckmann
fuente
31
No entiendo cómo agregar una "s" hace que el marco sea más inteligente, en mi humilde opinión, esa es una mala idea. Aparte de esa mangosta, es un marco increíble.
Roberto
14
es una vieja mala elección que rompe la compatibilidad con versiones anteriores si se quita. así que hemos optado por seguir con él.
Aaronheckmann
18
no solo agrega una 's' sino que hace el plural correcto del nombre. Pruebe las instancias con 'mouse', obtendrá una colección llamada 'mouse' o con 'person' obtendrá 'people'. Me estaba volviendo loco entender de dónde vienen estos nombres :-)
Enrico Giurin
3
Esto es muy loco ahora, ¿qué nombre usas para consultar tu colección especialmente cuando tienes que hacerlo desde otra interfaz?
Xsmael
8
Me estaba volviendo loco, porque definí "pincel" y había una colección llamada "pinceles". Estuve tratando de encontrar dónde lo había definido durante casi media hora y no encontré nada. Pensé: "Tal vez sea inteligente y agrega eso. Probablemente no, pero veamos ... FUUUUUUU"
Fusseldieb
49

La estructura API de mongoose.model es la siguiente:

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

Lo que hace Mangosta es que, cuando no se pasa ningún argumento de colección, Mongoose produce un nombre de colección al pluralizar el nombre del modelo. Si no le gusta este comportamiento, pase un nombre de colección o configure la opción de nombre de colección de esquemas.

Ejemplo:

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

o

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

o

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);
Nishank Singla
fuente
30

A partir de mongoose 5.x, puede desactivarlo por completo:

mongoose.pluralize(null);
Andrey Hohutkin
fuente
La mejor solución, porque no tenemos que definir tanto el nombre del modelo como el nombre de la colección.
Nezih
Este es definitivamente el mejor enfoque.
netishix
1
Me tomó algunas horas aprender sobre este tipo de inteligencia de Mongoose. De todos modos, me alegro de haber encontrado esta solución. Por cierto: también evita la minúscula automática de los nombres de las colecciones.
Bernhard Fürst
8

Simplemente puede agregar una cadena como tercer argumento para definir el nombre real de la colección. Ampliando sus ejemplos, para mantener los nombres como datay userrespectivamente:

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

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

Puede agregar el nombre de la colección como tercer parámetro. Vea el ejemplo usando 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
fuente
2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

Agregar la línea mongoose.pluralize(null)en su archivo Mongoose evitará la pluralización del nombre de la colección. No es necesario que agregue esta línea a sus archivos de modelo.

Como se ve aquí .

Daniel Segura
fuente
1

Al final de definir su esquema en la siguiente línea, use este código

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

Suponiendo que su estado es lo que desea usar en su base de datos para evitar s como estados

Haga clic en el enlace para ver la imagen correctamente

Pedro JR
fuente
-2

Mongoose compila un modelo para usted cuando ejecuta este comando

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

El primer argumento es el nombre singular de la colección para la que es su modelo. Mongoose busca automáticamente la versión en plural y en minúsculas del nombre de su modelo. Por lo tanto, para el ejemplo anterior, el hijo modelo es para la colección de hijos en la base de datos.

Nota: la .model()función hace una copia del esquema. ¡Asegúrese de haber agregado todo lo que desea al esquema, incluidos los ganchos, antes de llamar .model()!

Kushagra
fuente
estás recreando el problema?
Pedro JR