sql >> Base de Datos >  >> NoSQL >> MongoDB

Primeros pasos con MongoDB y Mongoose

En esta publicación, le mostraremos cómo usar Mongoose para sus implementaciones de MongoDB para crear una solución basada en esquemas más sencilla para modelar los datos de su aplicación.

¿Qué es la mangosta?

Mongoose es un “elegante modelado de objetos MongoDB para Node.js “. Si usó MongoDB antes y probó las operaciones básicas de la base de datos, es posible que haya notado que MongoDB es "sin esquema". Cuando busca implementar una base de datos más estructurada y quiere aprovechar el poder de MongoDB, Mongoose es uno de los ODM (O objeto D ata M aplicaciones).

Para demostrarlo rápidamente, ejecute un comando de inserción en una colección llamada usuarios así:


db.users.insert({ name : 'Arvind', gender : 'male'});

Y justo después de eso, puedes ejecutar:


db.users.insert({ name : 'Arvind', gender : 'male', password : '!@#$'});

y MongoDB nunca se quejará de la variación en el número de columnas (pares clave-valor). Esto es muy flexible. Pero cuando desee mantener sus datos más organizados y estructurados, deberá mantener eso en el código de su servidor, escribiendo la validación, asegurándose de que no se almacene nada irrelevante en una colección. Aquí es donde Mongoose hace la vida más fácil.

“Mongoose proporciona una solución sencilla basada en esquemas para modelar los datos de su aplicación e incluye encasillamiento, validación, creación de consultas, enlaces de lógica empresarial y más integrados , fuera de la caja.”

Instalar Node.js y MongoDB

Para usar Mongoose, necesitamos tener instalado Node.js. Puede encontrar información aquí.

Empezar a desarrollar

Primero, creemos un pequeño patio de recreo donde podamos divertirnos. Cree una nueva carpeta llamada myMongooseApp y abra la terminal/solicitud aquí y ejecute:

npm init

Esto nos ayudará a inicializar un nuevo proyecto de nodo. Llénalo según sea necesario. A continuación, instalaremos Mongoose como una dependencia de nuestro proyecto. Ejecutar:

npm install mongoose --save-dev

Luego, inicie el servicio MongoDB ejecutando:

mongod

Luego, cree un nuevo archivo llamado index.js en la raíz y luego ábralo en su editor favorito. Agregue el siguiente código:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myTestDB');

var db = mongoose.connection;

db.on('error', function (err) {
console.log('connection error', err);
});
db.once('open', function () {
console.log('connected.');
});

Aquí, requerimos el paquete Mongoose para conectarse a la base de datos e inicializar la conexión. El nombre de nuestra base de datos es myTestDB.

Luego, ejecuta:

node index.js

Ahora debería ver el mensaje conectado. También puede usar un paquete de nodos llamado nodemon para reiniciar automáticamente el servidor de nodos en los cambios.

Ahora, ¡nuestra caja de arena está lista para jugar!

Esquemas de mangosta

Los esquemas son como esqueletos, los esqueletos básicos de cómo se verá su recopilación de datos. Si está tratando con una colección de usuarios, su esquema se vería así:

Name - String
Age - Number
Gender - String
Date of Birth - Date

Si está tratando con una colección de productos, su esquema se verá así:

SKU - String
Name - String
Price - Number
InStock - Boolean
Quantity - Number

Puedes ver la deriva. Cuando nuestros datos están resguardados con un esquema como este, la posibilidad de almacenar datos basura se reduce drásticamente.

Ahora que comprendemos los esquemas, intentemos crear un esquema de usuario con Mongoose. Regrese a index.js y agregue el siguiente código:

var Schema = mongoose.Schema;
var userSchema = new Schema({
name : String,
age : Number,
DOB : Date,
isAlive : Boolean
});

Encuentre campos básicos relacionados con el usuario y sus tipos de esquema aquí.

A continuación, crearemos un modelo a partir del esquema. Añadir:

var User = mongoose.model('User', userSchema);

Eso es todo, ¡nuestro modelo de usuario está listo! Usaremos esto como nuestro esquema base para insertar usuarios en la base de datos. De esta forma, sabemos que cada documento en una colección de usuarios tendrá los campos enumerados en el esquema. Vamos a crear una nueva instancia de usuario y guardarla en la base de datos. Añadir:

var arvind = new User({
name : 'Arvind',
age : 99,
DOB : '01/01/1915',
isAlive : true
});

arvind.save(function (err, data) {
if (err) console.log(err);
else console.log('Saved : ', data );
});

Deberías ver algo como esto:

Saved : { __v: 0,
name: 'Arvind',
age: 99,
DOB: Fri Jan 01 1915 00:00:00 GMT+0530 (IST),
isAlive: true,
_id: 536a4866dba434390d728216 }

Sin complicaciones, sin problemas. API simple y fácil para interactuar con modelos.

Digamos que queremos que cada modelo tenga un método llamado isYounger. Este método devolverá verdadero si la edad es menor de 50 años y falso si es mayor. Podemos hacer esto consultando la base de datos para el usuario actual, luego verificando el condicionamiento y devolviendo verdadero o falso.

¿Pero qué pasa si queremos implementar este método a todos los modelos de esquema de usuario? Así es como lo hacemos en Mongoose:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myTestDB');

var db = mongoose.connection;

db.on('error', function (err) {
console.log('connection error', err);
});
db.once('open', function () {
console.log('connected.');
});

var Schema = mongoose.Schema;
var userSchema = new Schema({
name : String,
age : Number,
DOB : Date,
isAlive : Boolean
});

userSchema.methods.isYounger = function () {
return this.model('User').age < 50 ? true : false;
}

var User = mongoose.model('User', userSchema);

var arvind = new User({
name : 'Arvind',
age : 99,
DOB : '01/01/1915',
isAlive : true
});

arvind.save(function (err, data) {
if (err) console.log(err);
else console.log('Saved ', data );
});

console.log('isYounger : ',arvind.isYounger());

En la línea 21, agregamos la definición del método y el resultado en la línea 39 será falso. Esta es una manera simple y práctica de agregar métodos a su esquema, haciéndolo más orientado a objetos.

En caso de que tenga un campo de contraseña, puede agregar un método como encryptPassword(), para cifrar la contraseña y comparePassword(), para comparar las contraseñas al iniciar sesión con el propio userSchema. Puede leer más sobre la autenticación de contraseña aquí.

Mongoose listo para usar también proporciona algunas opciones cuando se crea el esquema. Por ejemplo, si observa la siguiente declaración de esquema, estamos pasando una opción estricta:falsa:

var userSchema = new Schema({
name : String,
age : Number,
DOB : Date,
isAlive : Boolean
}, {strict : false});

La opción estricta es verdadera de forma predeterminada y no permite que se guarden los pares clave-valor 'sin esquema'. Por ejemplo, esto se guardará:

var arvind = new User({
name : 'Arvind',
age : 99,
DOB : '01/01/1915',
isAlive : true
});

Considerando que:

var arvind = new User({
name : 'Arvind',
age : 99,
DOB : '01/01/1915',
isAlive : true,
bucketList : [{...}, {...}, {...} ]
});

Todo lo anterior se guardará menos la matriz bucketList porque no se declaró como parte del esquema. Por lo tanto, ningún cliente que consuma sus servicios podrá volcar datos no válidos en sus colecciones.

Otra opción genial es la colección. Si no desea que el nombre de su modelo sea el mismo que el nombre de la colección, puede pasar el nombre como una opción como:

var userSchema = new Schema({
name : String,
age : Number,
DOB : Date,
isAlive : Boolean
}, {collection : 'appusers'});

Puedes encontrar una lista de otras opciones aquí.

Con Mongoose, también puede agregar eventos a sus esquemas como pre-guardado o post-guardado, donde puede realizar validaciones, procesar datos o ejecutar otras consultas en los eventos respectivos. Estos métodos se denominan Middlewares.

Un ejemplo simple puede ser un middleware paralelo como:

var userSchema = new Schema({
name : String,
age : Number,
DOB : Date,
isAlive : Boolean
})
schema.pre('save', true, function (next, done) {
// calling next kicks off the next middleware in parallel
next();
doAsync(done);
});

Puedes leer más sobre los middlewares aquí. En nuestra próxima publicación, hablaremos más sobre el uso de Yeoman para generar automáticamente scaffolding para sus proyectos de MongoDB.

Gracias por leer. Comente.
@arvindr21