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

Bob Ren
fonte
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' })

Aaronheckmann
fonte
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);
Nishank Singla
fonte
30

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

mongoose.pluralize(null);
Andrey Hohutkin
fonte
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');
Andrea
fonte
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;
sebu
fonte
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 .

Daniel Segura
fonte
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

Pedro JR
fonte
-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()!

Kushagra
fonte
você está recriando o problema?
Pedro JR