Perché la mangusta aggiunge sempre una s alla fine del nome della mia raccolta


120

Ad esempio, questo codice risulta nella creazione di una raccolta denominata "dati"

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

E questo codice risulta nella creazione di una raccolta chiamata "utenti"

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

Grazie


3
È la convenzione in Rails. Hai l'oggetto "utente", lo memorizzi nella raccolta "utenti". È lo stesso in Mangusta, immagino.
Sergio Tulentsev

Sì, abbastanza interessante è var Dataset = mongoose.model ('datas', dataSchema); risulta in una raccolta chiamata dati.
Bob Ren,

Sembra che la logica del pluralismo non sia così stupida (o intelligente, dipende da ciò che ti aspettavi). Sono sicuro che puoi scoprire come funziona esattamente (trova la fonte).
Sergio Tulentsev

2
@SergioTulentsev, che non è rubino, ma funziona allo stesso modo github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
Solo per la cronaca. I dati sono plurali, il singolare dei dati è il dato
Luis Sieira

Risposte:


200

Mongoose sta cercando di essere intelligente rendendo il nome della tua collezione plurale. Puoi tuttavia forzarlo a essere quello che vuoi:

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


31
Non capisco come l'aggiunta di una "s" renda il framework più intelligente, IMHO, questa è una cattiva idea. A parte quella mangusta è un quadro fantastico.
Roberto

14
è una vecchia scelta scadente che rompe la compatibilità con le versioni precedenti se eliminata. quindi abbiamo scelto di mantenerlo.
aaronheckmann

18
non aggiunge solo una 's' ma rende il plurale corretto del nome. Prova per istanze con "mouse", otterrai una raccolta denominata "mouse" o con "persona" otterrai "persone". Mi stava facendo impazzire capire da dove venissero questi nomi :-)
Enrico Giurin

3
Questo è molto folle ora, quale nome usi per interrogare la tua raccolta specialmente quando devi farlo da un'altra interfaccia?
Xsmael

8
Stavo andando fuori di testa, perché ho definito "pennello" e c'era una collezione chiamata "pennelli". Stavo cercando di trovare dove l'avevo definito per quasi mezz'ora e non ho trovato nulla. Ho pensato: "Forse è intelligente e aggiunge quello. Probabilmente no, ma vediamo .... FUUUUUUU"
Fusseldieb

49

La struttura API di mongoose.model è questa:

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

Quello che fa la mangusta è che, quando non viene passato alcun argomento di raccolta, Mongoose produce un nome di raccolta pluralizzando il nome del modello. Se non ti piace questo comportamento, passa un nome di raccolta o imposta l'opzione per il nome della raccolta di schemi.

Esempio:

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 partire da mongoose 5.x puoi disabilitarlo completamente:

mongoose.pluralize(null);

Soluzione migliore, perché non dobbiamo definire sia il nome del modello che il nome della raccolta.
Nezih

Questo è sicuramente l'approccio migliore.
netishix

1
Mi ci sono volute alcune ore per conoscere questo tipo di intelligenza della Mangusta. Comunque, sono contento di aver trovato questa soluzione. BTW: Evita anche l'involucro minuscolo automatico dei nomi delle raccolte.
Bernhard Fürst,

8

Puoi semplicemente aggiungere una stringa come terzo argomento per definire il nome effettivo della raccolta. Estendendo i tuoi esempi, per mantenere i nomi come datae userrispettivamente:

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

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

2

È possibile aggiungere il nome della raccolta come terzo parametro. Guarda l'esempio 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);

L'aggiunta della riga mongoose.pluralize(null)nel file Mongoose impedirà il pluralismo del nome della raccolta. Non è necessario aggiungere questa riga ai file del modello.

Come visto qui .



-2

Mongoose compila un modello per te quando esegui questo comando

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

Il primo argomento è il nome singolare della raccolta a cui è destinato il modello. Mongoose cerca automaticamente la versione plurale e minuscola del nome del modello. Pertanto, per l'esempio precedente, il modello figlio è per la raccolta figlio nel database.

Nota: la .model()funzione crea una copia dello schema. Assicurati di aver aggiunto tutto ciò che desideri allo schema, inclusi gli hook, prima di chiamare .model()!


stai ricreando il problema?
Pedro JR,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.