Saltar al contenido

NodeJS Mongo – Mongoose – Nombre de colección dinámico

No dudes en divulgar nuestro sitio y códigos en tus redes, ayúdanos a ampliar nuestra comunidad.

Solución:

Hola, solo necesita declarar el modelo de esquema con su nombre dinámico, así:

var mongoose  =  require('mongoose');
var Schema  =  mongoose.Schema;

// our schema 

function dynamicSchema(prefix)
    var addressSchema = new Schema(
        dir : type : String, required : true,    //los 2 nombres delimitados por coma (,) ej. Alberto,Andres
        city : type : String, required: true,   //la misma estructura que para los nombres ej. Acosta, Arteta 
        postal : type : Number, required : true,
        _home_type : type : Schema.Types.ObjectId, required : true, ref : prefix + '.home_type',
        state : type : String, required : true,
        telefono : String,
        registered : type : Date, default: Date.now 
    );
    return mongoose.model(prefix + '.address', addressSchema);


//no we export dynamicSchema function
module.exports = dynamicSchema;

entonces en su código en cualquier lugar puede hacer esto:

var userAdress = require('address.js')(id_user);
var usrAdrs1 = new userAddress(...);
    userAdrs1.save();

Ahora vaya a su mongo shell & list collections (use mydb y luego muestre las colecciones), verá una nueva colección para la dirección con uid prefix. De esta forma, mongoose creará una nueva dirección de colección para cada uid de usuario diferente.

Utilice la función para obtener el modelo de forma dinámica.

/* 
 * Define Schemas as you used to 
 */
const ConvForUserSchema = new Schema(
    user_id: Number,
    conv_hash: String,
    archived: Boolean,
    unread: Boolean
,
    versionKey : false,
    strict: false
);

/*
 * Define the dynamic function
 */
const models = ;
const getModel = (collectionName) => 
    if( !(collectionName in models) )
        models[collectionName] = connection.model(
            collectionName, ConvForUserSchema, collectionName
        );
    
    return models[collectionName];
;

Luego obtenga el modelo dinámico usando la función

const result = getModel("YourCollectionName").findOne()

La lógica del nombre de la colección está codificada de forma rígida en todo el código base de Moongose, de modo que la partición del lado del cliente simplemente no es posible tal como están las cosas ahora.

Mi solución fue trabajar directamente con el controlador mongo:

https://github.com/mongodb/node-mongodb-native

Esto resultó excelente, la flexibilidad de trabajar directamente con el conductor permite todo lo necesario y la sobrecarga de Moongose ​​no parece agregar mucho en ningún caso.

Puedes añadir valor a nuestro contenido contribuyendo tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *