Saltar al contenido

Crear dinámicamente una colección con Mongoose

Estate atento porque en este tutorial hallarás la solución que buscas.

Solución:

Creo que esta es una idea terrible de implementar, pero una pregunta merece una respuesta. Debe definir un esquema con un nombre dinámico que permita información de tipo ‘Cualquiera’ en él. Una función para hacer esto puede ser un poco similar a esta función:

var establishedModels = ;
function createModelForName(name) 
    if (!(name in establishedModels)) 
        var Any = new Schema( any: Schema.Types.Mixed );
        establishedModels[name] = mongoose.model(name, Any);
    
    return establishedModels[name];

Ahora puedes crear modelos que permitan obtener información sin ningún tipo de restricción, incluido el nombre. Voy a asumir un objeto definido así, name: 'hello', content: x: 1, que es proporcionado por el ‘usuario’. Para guardar esto, puedo ejecutar el siguiente código:

var stuff = name: 'hello', content: x: 1; // Define info.
var Model = createModelForName(name); // Create the model.
var model = Model(stuff.content); // Create a model instance.
model.save(function (err)  // Save
    if (err) 
        console.log(err);
    
);

Las consultas son muy similares, obtenga el modelo y luego haga una consulta:

var stuff = name: 'hello', query: x: '$gt': 0; // Define info.
var Model = createModelForName(name); // Create the model.
model.find(stuff.query, function (err, entries) 
    // Do something with the matched entries.
);

Tendrá que implementar código para proteger sus consultas. No desea que el usuario explote su base de datos.

De mongo docs aquí: modelado de datos

En determinadas situaciones, puede optar por almacenar información en varias colecciones en lugar de en una única colección.

Considere una colección de registros de muestra que almacena documentos de registro para varios entornos y aplicaciones. La colección de registros contiene documentos del siguiente formato:

registro: “dev”, ts: …, información: … registro: “depuración”, ts: …, información: …

Si el número total de documentos es bajo, puede agrupar los documentos en una colección por tipo. Para los registros, considere mantener colecciones de registros distintas, como logs.dev y logs.debug. La colección logs.dev contendría solo los documentos relacionados con el entorno de desarrollo.

Generalmente, tener una gran cantidad de colecciones no tiene una penalización de rendimiento significativa y da como resultado un rendimiento muy bueno. Las colecciones distintas son muy importantes para el procesamiento por lotes de alto rendimiento.

Digamos que tengo 20 eventos diferentes. Cada evento tiene 1 millón de entradas… Como tal, si todo esto está en una colección, tendré que filtrar la colección por evento para cada operación CRUD.

Le sugiero que mantenga todos los eventos en la misma colección, especialmente si los nombres de los eventos dependen del código del cliente y, por lo tanto, están sujetos a cambios. En su lugar, indexe el nombre y la referencia del usuario.

mongoose.Schema(
  name:  type: String, index: true ,
  user:  type: mongoose.Schema.Types.ObjectId, ref: 'User', index: true  
);

Además, creo que abordaste el problema un poco al revés (pero podría estar equivocado). ¿Está encontrando eventos dentro del contexto de un usuario, o está encontrando usuarios dentro del contexto de un nombre de evento? Tengo la sensación de que es lo primero, y deberías particionar según la referencia del usuario, no el nombre del evento en primer lugar.

Si no necesita encontrar todos los eventos para un usuario y solo necesita tratar con el nombre del usuario y el evento juntos, puede optar por un índice compuesto:

schema.index( user: 1, name: 1 );

Si está tratando con millones de documentos, asegúrese de desactivar el índice automático:

schema.set('autoIndex', false);

Esta publicación tiene cosas interesantes sobre cómo nombrar colecciones y usar un esquema específico también:

¿Cómo acceder a una colección preexistente con Mongoose?

Te mostramos las comentarios y valoraciones de los lectores

Si sostienes alguna duda y forma de acrecentar nuestro tutorial puedes escribir una disquisición y con placer lo estudiaremos.

¡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 *