Empezando con Camo

    Introducci贸n

    Ante todo, Camuflaje es un nuevo ODM ES6 basado en clases para MongoDB y Node. Con la corriente principal de ES6 acerc谩ndose r谩pidamente a nosotros, pens茅 que hac铆a tiempo que deb铆amos tener un ODM que aprovechara las nuevas funciones, as铆 que cre茅 Camo. Lo que m谩s me molest贸 al pasar de la programaci贸n Java a JavaScript fue la falta de clases de estilo tradicional. Creo que para los principiantes especialmente, esta es una caracter铆stica importante que debe tener cualquier ODM.

    En este tutorial te mostrar茅 c贸mo usar las funciones b谩sicas de Camo (declaraci贸n de esquema, guardar, cargar, etc.). Para facilitar las comparaciones con Mongoose, mostrar茅 ejemplos similares al art铆culo Empezando con Mongoose. Esperamos que desde aqu铆 pueda decidir qu茅 estilo / funcionalidad le gusta m谩s para usar en sus proyectos.

    Conectando Camo a MongoDB

    Nota: El c贸digo de este art铆culo usa v0.12.1 de Camo.

    Para conectar Camo a su base de datos, simplemente pase la cadena de conexi贸n (generalmente con el formato mongodb://[ip-address]/[db-name]) al connect() m茅todo, que devolver谩 una instancia del cliente Camo. La instancia del cliente se puede utilizar para configurar la base de datos, pero no es necesaria para declarar, guardar o eliminar sus documentos.

    var connect = require('camo').connect;
     
    var database;
    var uri = 'mongodb://localhost/test';
    connect(uri).then(function(db) {
        database = db;
    });
    

    Esquemas y modelos

    Los modelos son declarado usando clases ES6 y debe extender el Document objeto. El esquema del modelo se declara dentro del constructor y cualquier variable miembro que no comience con un gui贸n bajo (_) se incluye en el esquema y se guarda en la base de datos. Una variable miembro se puede declarar asign谩ndole directamente un tipo o asign谩ndole un objeto con opciones.

    var Document = require('camo').Document;
     
    class Movie extends Document {
        constructor() {
            super();
    
            this.title = String;
            this.rating = {
                type: String,
                choices: ['G', 'PG', 'PG-13', 'R']
            };
            this.releaseDate = Date;
            this.hasCreditCookie = Boolean;
        }
    
        static collectionName() {
            return 'movies';
        }
    }
    

    El nombre de la colecci贸n se declara pasando anulando la est谩tica collectionName() m茅todo. Aunque este nombre rara vez se necesita en el c贸digo, ser谩 煤til al inspeccionar la base de datos MongoDB manualmente, por lo que es mejor mantenerlo relevante para el nombre del modelo.

    Si collectionName() no se proporciona, Camo asignar谩 autom谩ticamente un nombre de colecci贸n basado en el nombre de la clase.

    Crear, recuperar, actualizar y eliminar (CRUD)

    Para crear una instancia del modelo, simplemente use el create() , que maneja gran parte del trabajo de creaci贸n de instancias por usted. Opcionalmente, los datos se pueden pasar a create() que se asignar谩 a las variables miembro. Si no se pasan datos para una variable, se le asigna un valor predeterminado (si se especifica en el esquema) o se le asigna null.

    var thor = Movie.create({
        title: 'Thor',
        rating: 'PG-13',
        releaseDate: new Date(2011, 4, 2),
        hasCreditCookie: true
    });
    
    thor.save().then(function
        console.log(thor);
    });
    

    Cuando ahorro instancia, los datos se insertar谩n en la base de datos si no se han guardado previamente. Si la instancia ya se ha guardado en la base de datos, el documento existente se actualiza con los cambios.

    A Eliminar un documento, simplemente llame al delete m茅todo en 茅l. Tambi茅n puede utilizar la est谩tica deleteOne(), deleteMany()o findOneAndDelete() en la clase modelo. El n煤mero de documentos eliminados de la base de datos se devolver谩 dentro del Promise.

    thor.delete().then(function(numDeleted) {
        console.log(numDeleted);
    });
    

    A carga un documento de la base de datos, tiene algunas opciones dependiendo de lo que desee hacer. Las opciones son:

    • findOne() para cargar un solo documento (o nulo si no existe)
    // Load only the 'Thor' movie
    Movie.findOne({ title: 'Thor' }).then(function(movie) {
    	console.log(thor);
    });
    
    • find() para cargar varios documentos (o una matriz vac铆a si no existe)
    // Load all movies that have a credit cookie
    Movie.find({ hasCreditCookie: true }).then(function(movies) {
        console.log(thor);
    });
    
    • findOneAndUpdate() para recuperar un documento y actualizarlo en una sola operaci贸n at贸mica
    // Update 'Thor' to have a rating of 'R'
    Movie.findOneAndUpdate({ title: 'Thor' }, { rating: 'R' }).then(function(movies) {
        console.log(thor);
    });
    

    Extras

    Gracias al soporte de Camo de las clases de ES6, podemos definir f谩cilmente est谩ticas, virtuales y m茅todos para los modelos, lo que hace que el c贸digo del modelo sea mucho m谩s organizado y legible.

    var Document = require('camo').Document;
     
    class Movie extends Document {
        constructor() {
            super();
    
            // Schema declaration here...
        }
    
        set releaseYear(year) {
            this.releaseDate.setYear(year);
        }
    
        get releaseYear() {
            return this.releaseDate.getFullYear();
        }
    
        yearsOld() {
            return new Date().getFullYear() - this.releaseDate.getFullYear();
        }
    
        static findAllRMovies() {
            return this.find({ rating: 'R' });
        }
    }
    
    var uri = 'nedb://memory';
    
    connect(uri).then(function(db) {
        var thor = Movie.create({
            title: 'The Matrix',
            rating: 'R',
            releaseDate: new Date(1999, 2, 31),
            hasCreditCookie: true
        });
        
        return thor.save();
    }).then(function
        return Movie.findAllRMovies();
    }).then(function(movies) {
        movies.forEach(function(m) {
            console.log(m.title + ': ' + m.releaseDate.getFullYear());
        });
    });
    

    Adem谩s de interactuar con MongoDB, Camo tambi茅n admite NeDB, que es como el equivalente de SQLite a Mongo. Un ejemplo de uso de NeDB se muestra arriba. Su uso es muy 煤til durante el desarrollo y las pruebas, ya que los datos se pueden almacenar en un archivo o simplemente en la memoria. 隆Esto tambi茅n significa que puede usar Camo en el c贸digo del navegador frontal!

    Dir铆gete al p谩gina del proyecto para m谩s informaci贸n. 驴Te gusta lo que ves? 隆Destaque el proyecto y corra la voz!

     

    Deja una respuesta

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