¿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


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


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

30

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

mongoose.pluralize(null);

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

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;

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í .



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


estás recreando el problema?
Pedro JR
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.