Pourquoi la mangouste ajoute-t-elle toujours un s à la fin du nom de ma collection

120

Par exemple, ce code entraîne la création d'une collection appelée "datas"

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

Et ce code entraîne la création d'une collection appelée "utilisateurs"

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

Merci

Bob Ren
la source
3
C'est la convention de Rails. Vous avez l'objet "utilisateur", vous le stockez dans la collection "utilisateurs". C'est la même chose à Mongoose, je suppose.
Sergio Tulentsev
Ouais, assez intéressant var Dataset = mongoose.model ('datas', dataSchema); aboutit à une collection appelée datas.
Bob Ren
Il semble que la logique de pluralisation n'est pas si stupide (ou intelligente, dépend de ce que vous attendiez). Je suis sûr que vous pouvez découvrir comment cela fonctionne exactement (trouvez la source).
Sergio Tulentsev
2
@SergioTulentsev, ce n'est pas ruby, mais cela fonctionne de la même manière github.com/LearnBoost/mongoose/blob/master/lib/utils.js
7
Juste pour info. Les données sont au pluriel, le singulier de données est datum
Luis Sieira

Réponses:

200

Mongoose essaie d'être intelligent en rendant le nom de votre collection au pluriel. Vous pouvez cependant le forcer à être ce que vous voulez:

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

Aaronheckmann
la source
31
Je ne comprends pas comment l'ajout d'un "s" rend le cadre plus intelligent, à mon humble avis, c'est une mauvaise idée. En dehors de cette mangouste, il y a un cadre génial.
Roberto
14
c'est un vieux mauvais choix qui rompt la rétrocompatibilité s'il est retiré. nous avons donc choisi de nous y tenir.
aaronheckmann
18
il n'ajoute pas simplement un «s» mais il crée le pluriel correct du nom. Essayez pour les instances avec «souris», vous obtiendrez une collection nommée «souris» ou avec «personne», vous obtiendrez «personnes». Cela me rendait fou de comprendre d'où venaient ces noms :-)
Enrico Giurin
3
C'est très fou maintenant quel nom utilisez-vous pour interroger votre collection, surtout lorsque vous devez le faire à partir d'une autre interface?
Xsmael
8
Je paniquais, parce que j'avais défini «pinceau» et qu'il y avait une collection nommée «pinceaux». J'essayais de trouver où j'avais défini cela pendant près d'une demi-heure et je n'ai rien trouvé. J'ai pensé: "Peut-être que c'est intelligent et ajoute ça. Probablement pas, mais voyons ... FUUUUUUU"
Fusseldieb
49

La structure de l'API de mongoose.model est la suivante:

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

Ce que mangouste fait, c'est que, lorsqu'aucun argument de collection n'est passé, Mongoose produit un nom de collection en mettant au pluriel le nom du modèle. Si vous n'aimez pas ce comportement, transmettez un nom de collection ou définissez votre option de nom de collection de schémas.

Exemple:

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
la source
30

À partir de mongoose 5.x, vous pouvez le désactiver complètement:

mongoose.pluralize(null);
Andrey Hohutkin
la source
Meilleure solution, car nous n'avons pas à définir à la fois le nom du modèle et le nom de la collection.
Nezih
C'est certainement la meilleure approche.
netishix
1
Il m'a fallu quelques heures pour en apprendre davantage sur ce genre d'intelligence de la mangouste. Quoi qu'il en soit - heureux d'avoir trouvé cette solution. BTW: Cela évite également la casse inférieure automatique des noms de collection.
Bernhard Fürst le
8

Vous pouvez simplement ajouter une chaîne comme troisième argument pour définir le nom réel de la collection. Extension de vos exemples, pour conserver les noms comme dataet userrespectivement:

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

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

Vous pouvez ajouter le nom de la collection comme troisième paramètre. Voir l'exemple utilisant 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
la source
2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

L'ajout de la ligne mongoose.pluralize(null)dans votre fichier Mongoose empêchera la pluralisation des noms de collection. Vous n'avez pas besoin d'ajouter cette ligne à vos fichiers de modèle.

Comme vu ici .

Daniel Segura
la source
1

À la fin de la définition de votre schéma sur la ligne suivante Utilisez ce code

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

En supposant que votre état est ce que vous voulez utiliser sur votre base de données pour éviter les s comme états

Cliquez sur le lien pour afficher l'image correctement

Pedro JR
la source
-2

Mongoose compile un modèle pour vous lorsque vous exécutez cette commande

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

Le premier argument est le nom singulier de la collection pour laquelle votre modèle est destiné. Mongoose recherche automatiquement la version plurielle en minuscules du nom de votre modèle. Ainsi, pour l'exemple ci-dessus, le modèle enfant est pour la collection children dans la base de données.

Remarque: la .model()fonction fait une copie du schéma. Assurez-vous d'avoir ajouté tout ce que vous voulez schématiser, y compris les hooks, avant d'appeler .model()!

Kushagra
la source
vous recréez le problème?
Pedro JR le