Por que o mongoose sempre adiciona um s ao final do nome da minha coleção


120

Por exemplo, este código resulta em uma coleção chamada "dados" sendo criada

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

E esse código resulta em uma coleção chamada "usuários" sendo criada

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

obrigado


3
É a convenção em Rails. Você tem o objeto "usuário", você o armazena na coleção "usuários". É o mesmo em Mongoose, eu acho.
Sergio Tulentsev

Sim, curiosamente var Dataset = mongoose.model ('datas', dataSchema); resulta em uma coleção chamada datas.
Bob Ren

Parece que pluralizar a lógica não é tão burra (ou inteligente, depende do que você esperava). Tenho certeza que você pode descobrir como funciona exatamente (encontre a fonte).
Sergio Tulentsev

2
@SergioTulentsev, isso não é ruby, mas funciona da mesma maneira github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
Apenas para registro. Os dados são no plural, os dados no singular são datum
Luis Sieira

Respostas:


200

O Mongoose está tentando ser inteligente tornando o nome de sua coleção plural. No entanto, você pode forçá-lo a ser o que quiser:

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


31
Não entendo como adicionar um "s" torna a estrutura mais inteligente, IMHO, isso é uma má ideia. Além desse mangusto, é uma estrutura incrível.
Roberto

14
é uma escolha velha e pobre que quebra a compatibilidade com versões anteriores se removida. então escolhemos ficar com ele.
aaronheckmann

18
não adiciona apenas um 's', mas cria o plural correto do nome. Tente, por exemplo, com 'mouse', você obterá uma coleção chamada 'ratos' ou com 'pessoa', você obterá 'pessoas'. Estava me deixando maluco entender de onde vieram esses nomes :-)
Enrico Giurin

3
Isso é muito louco agora, qual nome você usa para consultar sua coleção, especialmente quando você precisa fazer isso de outra interface?
Xsmael 01 de

8
Eu estava pirando, porque eu defini "brush" e tinha uma coleção chamada "brushes". Eu estava tentando descobrir onde havia definido isso por quase meia hora e não encontrei nada. Pensei: "Talvez seja inteligente e acrescente isso. Provavelmente não, mas vamos ver .... FUUUUUUU"
Fusseldieb 01 de

49

A estrutura da API de mongoose.model é esta:

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

O que o mongoose faz é isso, quando nenhum argumento de coleção é passado, o Mongoose produz um nome de coleção pluralizando o nome do modelo. Se você não gostar desse comportamento, passe um nome de coleção ou defina a opção de nome de coleção de esquemas.

Exemplo:

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

ou

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

ou

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

30

A partir do mongoose 5.x, você pode desativá-lo completamente:

mongoose.pluralize(null);

Melhor solução, porque não precisamos definir o nome do modelo e o nome da coleção.
Nezih

Esta é definitivamente a melhor abordagem.
netishix

1
Levei algumas horas para aprender sobre esse tipo de esperteza do Mongoose. De qualquer forma - fico feliz por ter encontrado essa solução. BTW: também evita maiúsculas e minúsculas automáticas nos nomes das coleções.
Bernhard Fürst

8

Você pode simplesmente adicionar uma string como um terceiro argumento para definir o nome real da coleção. Ampliando seus exemplos, para manter os nomes como datae userrespectivamente:

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

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

2

Você pode adicionar o nome da coleção como terceiro parâmetro. Veja o exemplo 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);

Adicionando a linhamongoose.pluralize(null) em seu arquivo Mongoose impedirá a pluralização do nome da coleção. Você não precisa adicionar esta linha aos seus arquivos de modelo.

Como visto aqui .


1

No final da definição de seu esquema na próxima linha, use este código

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

Supondo que seu estado é o que você deseja usar em seu banco de dados para evitar s como estados

Clique no link para ver a imagem corretamente


-2

O Mongoose compila um modelo para você quando você executa este comando

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

O primeiro argumento é o nome singular da coleção para a qual seu modelo se destina. O Mongoose procura automaticamente a versão plural em minúsculas do nome do seu modelo. Assim, para o exemplo acima, o filho do modelo é para a coleção de filhos no banco de dados.

Observação: a .model()função faz uma cópia do esquema. Certifique-se de adicionar tudo o que deseja no esquema, incluindo ganchos, antes de chamar .model()!


você está recriando o problema?
Pedro JR
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.