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


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


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

30

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

mongoose.pluralize(null);

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

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;

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 .



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


vous recréez le problème?
Pedro JR le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.