MongoDB Tutorial
MongoDB Tutorial
Base de datos
La base de datos es un contenedor físico para colecciones. Cada base de datos obtiene su
propio conjunto de archivos en el sistema de archivos. Un solo servidor MongoDB
normalmente tiene varias bases de datos.
Colección
La colección es un grupo de documentos MongoDB. Es el equivalente a una tabla
RDBMS. Existe una colección dentro de una sola base de datos. Las colecciones no
imponen un esquema. Los documentos de una colección pueden tener diferentes campos.
Normalmente, todos los documentos de una colección tienen un propósito similar o
relacionado.
Documento
Un documento es un conjunto de pares clave-valor. Los documentos tienen un esquema
dinámico. El esquema dinámico significa que los documentos de la misma colección no
necesitan tener el mismo conjunto de campos o estructura, y los campos comunes en los
documentos de una colección pueden contener diferentes tipos de datos.
La siguiente tabla muestra la relación de la terminología RDBMS con MongoDB.
RDBMS MongoDB
Tabla Colección
columna Campo
Clave primaria Clave principal (clave predeterminada _id proporcionada por MongoDB)
Cliente y servidor de base de datos
Documento de muestra
El siguiente ejemplo muestra la estructura del documento de un sitio de blog, que es
simplemente un par clave-valor separado por comas.
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials point',
url: '[Link]
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2011,1,20,2,15),
like: 0
},
{
user:'user2',
message: 'My second comments',
dateCreated: new Date(2011,1,25,7,45),
like: 5
}
]
}
MongoDB - Ventajas
Cualquier base de datos relacional tiene un diseño de esquema típico que muestra el
número de tablas y la relación entre estas tablas. Mientras que en MongoDB, no existe el
concepto de relación.
{
_id: ,
Emp_ID: "10025AE336"
Personal_details:{
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26"
},
Contact: {
e-mail: "radhika_sharma.123@[Link]",
phone: "9848022338"
},
Address: {
city: "Hyderabad",
Area: "Madapur",
State: "Telangana"
}
}
{
_id: <ObjectId101>,
Emp_ID: "10025AE336"
}
Personal_details:
{
_id: <ObjectId102>,
empDocID: " ObjectId101",
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26"
}
Contact:
{
_id: <ObjectId103>,
empDocID: " ObjectId101",
e-mail: "radhika_sharma.123@[Link]",
phone: "9848022338"
}
Address:
{
_id: <ObjectId104>,
empDocID: " ObjectId101",
city: "Hyderabad",
Area: "Madapur",
State: "Telangana"
}
Consideraciones al diseñar Schema en
MongoDB
• Diseñe su esquema de acuerdo con los requisitos del usuario.
• Combine objetos en un documento si los usará juntos. De lo contrario, sepárelos
(pero asegúrese de que no sea necesario unirlos).
• Duplique los datos (pero limitado) porque el espacio en disco es barato en
comparación con el tiempo de cálculo.
• Realice uniones mientras escribe, no en lectura.
• Optimice su esquema para los casos de uso más frecuentes.
• Realice una agregación compleja en el esquema.
Ejemplo
Supongamos que un cliente necesita un diseño de base de datos para su blog / sitio web y
ve las diferencias entre RDBMS y el diseño de esquema de MongoDB. El sitio web tiene
los siguientes requisitos.
• Cada publicación tiene un título, una descripción y una URL únicos.
• Cada publicación puede tener una o más etiquetas.
• Cada publicación tiene el nombre de su editor y el número total de Me gusta.
• Cada publicación tiene comentarios proporcionados por los usuarios junto con su
nombre, mensaje, tiempo de datos y me gusta.
• En cada publicación, puede haber cero o más comentarios.
En el esquema RDBMS, el diseño de los requisitos anteriores tendrá un mínimo de tres
tablas.
{
_id: POST_ID
title: TITLE_OF_POST,
description: POST_DESCRIPTION,
by: POST_BY,
url: URL_OF_POST,
tags: [TAG1, TAG2, TAG3],
likes: TOTAL_LIKES,
comments: [
{
user:'COMMENT_BY',
message: TEXT,
dateCreated: DATE_TIME,
like: LIKES
},
{
user:'COMMENT_BY',
message: TEXT,
dateCreated: DATE_TIME,
like: LIKES
}
]
}
Entonces, mientras muestra los datos, en RDBMS debe unir tres tablas y en MongoDB, los
datos se mostrarán solo de una colección.
El comando de uso
MongoDB use DATABASE_NAMEse utiliza para crear la base de datos. El comando
creará una nueva base de datos si no existe; de lo contrario, devolverá la base de datos
existente.
Sintaxis
Sintaxis básica de use DATABASE declaración es la siguiente:
use DATABASE_NAME
Ejemplo
Si desea utilizar una base de datos con nombre <mydb>, luego use
DATABASE declaración sería la siguiente:
>use mydb
switched to db mydb
>db
mydb
>show dbs
local 0.78125GB
test 0.23012GB
Su base de datos creada (mydb) no está presente en la lista. Para mostrar la base de
datos, debe insertar al menos un documento en ella.
>[Link]({"name":"tutorials point"})
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB
El método dropDatabase ()
MongoDB [Link]() El comando se usa para eliminar una base de datos
existente.
Sintaxis
Sintaxis básica de dropDatabase() El comando es el siguiente:
[Link]()
Esto eliminará la base de datos seleccionada. Si no ha seleccionado ninguna base de
datos, eliminará la base de datos de 'prueba' predeterminada.
Ejemplo
Primero, verifique la lista de bases de datos disponibles usando el comando, show dbs.
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB
>
Si desea eliminar una nueva base de datos <mydb>, luego dropDatabase() comando
sería el siguiente:
>use mydb
switched to db mydb
>[Link]()
>{ "dropped" : "mydb", "ok" : 1 }
>
>show dbs
local 0.78125GB
test 0.23012GB
>
El método createCollection ()
MongoDB [Link](name, options) se utiliza para crear una colección.
Sintaxis
Sintaxis básica de createCollection() El comando es el siguiente:
[Link](name, options)
Ejemplos
Sintaxis básica de createCollection() El método sin opciones es el siguiente:
>use test
switched to db test
>[Link]("mycollection")
{ "ok" : 1 }
>
Puede verificar la colección creada usando el comando show collections.
>show collections
mycollection
[Link]
>[Link]({"name" : "tutorialspoint"}),
WriteResult({ "nInserted" : 1 })
>show collections
mycol
mycollection
[Link]
tutorialspoint
>
El método drop ()
MongoDB's [Link]() se utiliza para eliminar una colección de la base de
datos.
Sintaxis
Sintaxis básica de drop() El comando es el siguiente:
db.COLLECTION_NAME.drop()
Ejemplo
Primero, verifique las colecciones disponibles en su base de datos mydb.
>use mydb
switched to db mydb
>show collections
mycol
mycollection
[Link]
tutorialspoint
>
>[Link]()
true
>
>show collections
mycol
[Link]
tutorialspoint
>
El método insert ()
Para insertar datos en la colección de MongoDB, debe usar
MongoDB's insert() o save() método.
Sintaxis
La sintaxis básica de insert() El comando es el siguiente:
>db.COLLECTION_NAME.insert(document)
Ejemplo
> [Link]({
... _id : ObjectId("507f191e810c19729de860ea"),
... title: "MongoDB Overview",
... description: "MongoDB is no sql database",
... by: "tutorials point",
... url: "[Link]
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... })
WriteResult({ "nInserted" : 1 })
>
_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 by
tes incrementer)
También puede pasar una matriz de documentos al método insert () como se muestra a
continuación :.
> [Link]("post")
> [Link]([
{
title: "MongoDB Overview",
description: "MongoDB is no SQL database",
by: "tutorials point",
url: "[Link]
tags: ["mongodb", "database", "NoSQL"],
likes: 100
},
{
title: "NoSQL Database",
description: "NoSQL database doesn't have tables",
by: "tutorials point",
url: "[Link]
tags: ["mongodb", "database", "NoSQL"],
likes: 20,
comments: [
{
user:"user1",
message: "My first comment",
dateCreated: new Date(2013,11,10,2,35),
like: 0
}
]
}
])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
>
El método insertOne ()
Si necesita insertar solo un documento en una colección, puede utilizar este método.
Sintaxis
La sintaxis básica del comando insert () es la siguiente:
>db.COLLECTION_NAME.insertOne(document)
Ejemplo
El siguiente ejemplo crea una nueva colección llamada empDetails e inserta un documento
usando el método insertOne ().
> [Link]("empDetails")
{ "ok" : 1 }
> [Link](
{
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26",
e_mail: "radhika_sharma.123@[Link]",
phone: "9848022338"
})
{
"acknowledged" : true,
"insertedId" : ObjectId("5dd62b4070fb13eec3963bea")
}
>
El método insertMany ()
Puede insertar varios documentos utilizando el método insertMany (). Para este método,
debe pasar una serie de documentos.
Ejemplo
El siguiente ejemplo inserta tres documentos diferentes en la colección empDetails usando
el método insertMany ().
> [Link](
[
{
First_Name: "Radhika",
Last_Name: "Sharma",
Date_Of_Birth: "1995-09-26",
e_mail: "radhika_sharma.123@[Link]",
phone: "9000012345"
},
{
First_Name: "Rachel",
Last_Name: "Christopher",
Date_Of_Birth: "1990-02-16",
e_mail: "Rachel_Christopher.123@[Link]",
phone: "9000054321"
},
{
First_Name: "Fathima",
Last_Name: "Sheik",
Date_Of_Birth: "1990-02-16",
e_mail: "Fathima_Sheik.123@[Link]",
phone: "9000054321"
}
]
)
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5dd631f270fb13eec3963bed"),
ObjectId("5dd631f270fb13eec3963bee"),
ObjectId("5dd631f270fb13eec3963bef")
]
}
>
El método find ()
Para consultar datos de la colección de MongoDB, debe usar MongoDB's find() método.
Sintaxis
La sintaxis básica de find() El método es el siguiente:
>db.COLLECTION_NAME.find()
Ejemplo
Supongamos que hemos creado una colección llamada mycol como:
> [Link]([
{
title: "MongoDB Overview",
description: "MongoDB is no SQL database",
by: "tutorials point",
url: "[Link]
tags: ["mongodb", "database", "NoSQL"],
likes: 100
},
{
title: "NoSQL Database",
description: "NoSQL database doesn't have tables",
by: "tutorials point",
url: "[Link]
tags: ["mongodb", "database", "NoSQL"],
likes: 20,
comments: [
{
user:"user1",
message: "My first comment",
dateCreated: new Date(2013,11,10,2,35),
like: 0
}
]
}
])
> [Link]()
{ "_id" : ObjectId("5dd4e2cc0821d3b44607534c"), "title" : "MongoDB Overview",
"description" : "MongoDB is no SQL database", "by" : "tutorials point", "url"
: "[Link] "tags" : [ "mongodb", "database", "NoSQL"
], "likes" : 100 }
{ "_id" : ObjectId("5dd4e2cc0821d3b44607534d"), "title" : "NoSQL Database", "
description" : "NoSQL database doesn't have tables", "by" : "tutorials point"
, "url" : "[Link] "tags" : [ "mongodb", "database",
"NoSQL" ], "likes" : 20, "comments" : [ { "user" : "user1", "message" : "My f
irst comment", "dateCreated" : ISODate("2013-12-09T21:05:00Z"), "like" : 0 }
] }
>
El método pretty ()
Para mostrar los resultados de forma formateada, puede utilizar el método pretty ().
Sintaxis
>db.COLLECTION_NAME.find().pretty()
Ejemplo
El siguiente ejemplo recupera todos los documentos de la colección denominada mycol y
los organiza en un formato fácil de leer.
> [Link]().pretty()
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c"),
"title" : "MongoDB Overview",
"description" : "MongoDB is no SQL database",
"by" : "tutorials point",
"url" : "[Link]
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534d"),
"title" : "NoSQL Database",
"description" : "NoSQL database doesn't have tables",
"by" : "tutorials point",
"url" : "[Link]
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 20,
"comments" : [
{
"user" : "user1",
"message" : "My first comment",
"dateCreated" : ISODate("2013-12-09T21:05:00Z"),
"like" : 0
}
]
}
El método findOne ()
Aparte del método find (), hay findOne() método, que devuelve solo un documento.
Sintaxis
>[Link]()
Ejemplo
El siguiente ejemplo recupera el documento con el título Descripción general de MongoDB.
Y en MongoDB
Sintaxis
Para consultar documentos basados en la condición AND, debe usar $ y palabra clave. A
continuación se muestra la sintaxis básica de AND -
Ejemplo
El siguiente ejemplo mostrará todos los tutoriales escritos por 'punto de tutoriales' y cuyo
título es 'Descripción general de MongoDB'.
Para el ejemplo anterior, la cláusula where equivalente será ' where by = 'tutorials point'
AND title = 'MongoDB Overview' '. Puede pasar cualquier número de pares de clave y
valor en la cláusula de búsqueda.
O en MongoDB
Sintaxis
Para consultar documentos basados en la condición OR, debe usar $orpalabra clave. A
continuación se muestra la sintaxis básica deOR -
>[Link](
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
Ejemplo
El siguiente ejemplo mostrará todos los tutoriales escritos por 'punto de tutoriales' o cuyo
título es 'Descripción general de MongoDB'.
NOR en MongoDB
Sintaxis
Para consultar documentos basados en la condición NOT, debe utilizar la palabra clave $
not. A continuación se muestra la sintaxis básica deNOT -
>db.COLLECTION_NAME.find(
{
$not: [
{key1: value1}, {key2:value2}
]
}
)
Ejemplo
Supongamos que hemos insertado 3 documentos en la colección. empDetails como se
muestra a continuación -
[Link](
[
{
First_Name: "Radhika",
Last_Name: "Sharma",
Age: "26",
e_mail: "radhika_sharma.123@[Link]",
phone: "9000012345"
},
{
First_Name: "Rachel",
Last_Name: "Christopher",
Age: "27",
e_mail: "Rachel_Christopher.123@[Link]",
phone: "9000054321"
},
{
First_Name: "Fathima",
Last_Name: "Sheik",
Age: "24",
e_mail: "Fathima_Sheik.123@[Link]",
phone: "9000054321"
}
]
)
> [Link](
{
$nor:[
40
{"First_Name": "Radhika"},
{"Last_Name": "Christopher"}
]
}
).pretty()
{
"_id" : ObjectId("5dd631f270fb13eec3963bef"),
"First_Name" : "Fathima",
"Last_Name" : "Sheik",
"Age" : "24",
"e_mail" : "Fathima_Sheik.123@[Link]",
"phone" : "9000054321"
}
NO en MongoDB
Sintaxis
Para consultar documentos basados en la condición NOT, debe usar la palabra clave $
not, la siguiente es la sintaxis básica de NOT -
>db.COLLECTION_NAME.find(
{
$NOT: [
{key1: value1}, {key2:value2}
]
}
).pretty()
Ejemplo
El siguiente ejemplo recuperará los documentos cuya antigüedad no sea superior a 25
Sintaxis
La sintaxis básica de update() El método es el siguiente:
>db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
Ejemplo
Considere que la colección mycol tiene los siguientes datos.
>[Link]({'title':'MongoDB Overview'},
{$set:{'title':'New MongoDB Tutorial'}},{multi:true})
Sintaxis
La sintaxis básica de MongoDB save() El método se muestra a continuación:
>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
Ejemplo
El siguiente ejemplo reemplazará el documento con el _id '5983548781331adf45ec5'.
>[Link](
{
"_id" : ObjectId("507f191e810c19729de860ea"),
"title":"Tutorials Point New Topic",
"by":"Tutorials Point"
}
)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("507f191e810c19729de860ea")
})
>[Link]()
{ "_id" : ObjectId("507f191e810c19729de860e6"), "title":"Tutorials Point New
Topic",
"by":"Tutorials Point"}
{ "_id" : ObjectId("507f191e810c19729de860e6"), "title":"NoSQL Overview"}
{ "_id" : ObjectId("507f191e810c19729de860e6"), "title":"Tutorials Point Over
view"}
>
Sintaxis
La sintaxis básica de findOneAndUpdate() El método es el siguiente:
>db.COLLECTION_NAME.findOneAndUpdate(SELECTIOIN_CRITERIA, UPDATED_DATA)
Ejemplo
Supongamos que hemos creado una colección llamada empDetails e insertado tres
documentos en ella como se muestra a continuación:
> [Link](
[
{
First_Name: "Radhika",
Last_Name: "Sharma",
Age: "26",
e_mail: "radhika_sharma.123@[Link]",
phone: "9000012345"
},
{
First_Name: "Rachel",
Last_Name: "Christopher",
Age: "27",
e_mail: "Rachel_Christopher.123@[Link]",
phone: "9000054321"
},
{
First_Name: "Fathima",
Last_Name: "Sheik",
Age: "24",
e_mail: "Fathima_Sheik.123@[Link]",
phone: "9000054321"
}
]
)
El siguiente ejemplo actualiza la edad y los valores de correo electrónico del documento
con el nombre 'Radhika'.
> [Link](
{First_Name: 'Radhika'},
{ $set: { Age: '30',e_mail: 'radhika_newemail@[Link]'}}
)
{
"_id" : ObjectId("5dd6636870fb13eec3963bf5"),
"First_Name" : "Radhika",
"Last_Name" : "Sharma",
"Age" : "30",
"e_mail" : "radhika_newemail@[Link]",
"phone" : "9000012345"
}
>db.COLLECTION_NAME.updateOne(<filter>, <update>)
Ejemplo
> [Link](
{First_Name: 'Radhika'},
{ $set: { Age: '30',e_mail: 'radhika_newemail@[Link]'}}
)
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }
>
Sintaxis
La sintaxis básica del método updateMany () es la siguiente:
>db.COLLECTION_NAME.update(<filter>, <update>)
Ejemplo
> [Link](
{Age:{ $gt: "25" }},
{ $set: { Age: '00'}}
)
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Puede ver los valores actualizados si recupera el contenido del documento utilizando el
método de búsqueda como se muestra a continuación:
> [Link]()
{ "_id" : ObjectId("5dd6636870fb13eec3963bf5"), "First_Name" : "Radhika", "La
st_Name" : "Sharma", "Age" : "00", "e_mail" : "radhika_newemail@[Link]", "
phone" : "9000012345" }
{ "_id" : ObjectId("5dd6636870fb13eec3963bf6"), "First_Name" : "Rachel", "Las
t_Name" : "Christopher", "Age" : "00", "e_mail" : "Rachel_Christopher.123@gma
[Link]", "phone" : "9000054321" }
{ "_id" : ObjectId("5dd6636870fb13eec3963bf7"), "First_Name" : "Fathima", "La
st_Name" : "Sheik", "Age" : "24", "e_mail" : "Fathima_Sheik.123@[Link]", "
phone" : "9000054321" }
El método remove ()
MongoDB's remove()El método se utiliza para eliminar un documento de la colección. El
método remove () acepta dos parámetros. Uno es el criterio de eliminación y el segundo es
solo una bandera.
• deletion criteria - Se eliminarán los criterios de eliminación (opcional) de acuerdo
con los documentos.
• justOne - (Opcional) si se establece en verdadero o 1, elimine solo un documento.
Sintaxis
Sintaxis básica de remove() El método es el siguiente:
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
Ejemplo
Considere que la colección mycol tiene los siguientes datos.
El siguiente ejemplo eliminará todos los documentos cuyo título sea 'Descripción general
de MongoDB'.
>[Link]({'title':'MongoDB Overview'})
WriteResult({"nRemoved" : 1})
> [Link]()
{"_id" : ObjectId("507f191e810c19729de860e2"), "title" : "NoSQL Overview" }
{"_id" : ObjectId("507f191e810c19729de860e3"), "title" : "Tutorials Point Ove
rview" }
> [Link]({})
WriteResult({ "nRemoved" : 2 })
> [Link]()
MongoDB - Proyección
En MongoDB, la proyección significa seleccionar solo los datos necesarios en lugar de
seleccionar todos los datos de un documento. Si un documento tiene 5 campos y solo
necesita mostrar 3, seleccione solo 3 de ellos.
El método find ()
MongoDB's find(), explicado en MongoDB Query Document acepta el segundo parámetro
opcional que es la lista de campos que desea recuperar. En MongoDB, cuando
ejecutafind()método, luego muestra todos los campos de un documento. Para limitar esto,
debe establecer una lista de campos con valor 1 o 0. Se usa 1 para mostrar el campo
mientras que 0 se usa para ocultar los campos.
Sintaxis
La sintaxis básica de find() El método con proyección es el siguiente:
>db.COLLECTION_NAME.find({},{KEY:1})
Ejemplo
Considere la colección mycol tiene los siguientes datos:
>[Link]({},{"title":1,_id:0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Tutorials Point Overview"}
>
tenga en cuenta _id El campo siempre se muestra mientras se ejecuta find() método, si no
desea este campo, debe establecerlo como 0.
El método Limit ()
Para limitar los registros en MongoDB, debe usar limit()método. El método acepta un
argumento de tipo numérico, que es el número de documentos que desea que se
muestren.
Sintaxis
La sintaxis básica de limit() El método es el siguiente:
>db.COLLECTION_NAME.find().limit(NUMBER)
Ejemplo
Considere la colección myycol tiene los siguientes datos.
>[Link]({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>
Sintaxis
La sintaxis básica de skip() El método es el siguiente:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
Ejemplo
El siguiente ejemplo mostrará solo el segundo documento.
>[Link]({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}
>
El método sort ()
Para ordenar documentos en MongoDB, debe usar sort()método. El método acepta un
documento que contiene una lista de campos junto con su orden de clasificación. Para
especificar el orden de clasificación se utilizan 1 y -1. 1 se usa para orden ascendente
mientras que -1 se usa para orden descendente.
Sintaxis
La sintaxis básica de sort() El método es el siguiente:
>db.COLLECTION_NAME.find().sort({KEY:1})
Ejemplo
Considere la colección myycol tiene los siguientes datos.
El siguiente ejemplo mostrará los documentos ordenados por título en orden descendente.
>[Link]({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}
>
Tenga en cuenta que si no especifica la preferencia de clasificación, sort() El método
mostrará los documentos en orden ascendente.
MongoDB - Indexación
Los índices apoyan la resolución eficiente de consultas. Sin índices, MongoDB debe
escanear todos los documentos de una colección para seleccionar aquellos documentos
que coincidan con la declaración de consulta. Este análisis es muy ineficaz y requiere que
MongoDB procese un gran volumen de datos.
Los índices son estructuras de datos especiales que almacenan una pequeña parte del
conjunto de datos en una forma fácil de recorrer. El índice almacena el valor de un campo
específico o un conjunto de campos, ordenados por el valor del campo como se especifica
en el índice.
El método createIndex ()
Para crear un índice, debe utilizar el método createIndex () de MongoDB.
Sintaxis
La sintaxis básica de createIndex() El método es el siguiente ().
>db.COLLECTION_NAME.createIndex({KEY:1})
Aquí la clave es el nombre del campo en el que desea crear el índice y 1 es para el orden
ascendente. Para crear un índice en orden descendente, debe usar -1.
Ejemplo
>[Link]({"title":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>
En createIndex() método puede pasar varios campos, para crear un índice en varios
campos.
>[Link]({"title":1,"description":-1})
>
Este método también acepta una lista de opciones (que son opcionales). A continuación se
muestra la lista:
Parámetro Tipo Descripción
El método dropIndex ()
Puede eliminar un índice en particular utilizando el método dropIndex () de MongoDB.
Sintaxis
La sintaxis básica del método DropIndex () es la siguiente ().
>db.COLLECTION_NAME.dropIndex({KEY:1})
Aquí la clave es el nombre del archivo en el que desea crear el índice y 1 es para el orden
ascendente. Para crear un índice en orden descendente, debe usar -1.
Ejemplo
> [Link]({"title":1})
{
"ok" : 0,
"errmsg" : "can't find index with key: { title: 1.0 }",
"code" : 27,
"codeName" : "IndexNotFound"
}
El método dropIndexes ()
Este método elimina varios índices (especificados) en una colección.
Sintaxis
La sintaxis básica del método DropIndexes () es la siguiente () -
>db.COLLECTION_NAME.dropIndexes()
Ejemplo
Suponga que hemos creado 2 índices en la colección mycol nombrada como se muestra a
continuación:
> [Link]({"title":1,"description":-1})
>[Link]({"title":1,"description":-1})
{ "nIndexesWas" : 2, "ok" : 1 }
>
El método getIndexes ()
Este método devuelve la descripción de todos los índices de la colección.
Sintaxis
A continuación se muestra la sintaxis básica del método getIndexes ():
db.COLLECTION_NAME.getIndexes()
Ejemplo
Suponga que hemos creado 2 índices en la colección mycol nombrada como se muestra a
continuación:
> [Link]({"title":1,"description":-1})
> [Link]()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "[Link]"
},
{
"v" : 2,
"key" : {
"title" : 1,
"description" : -1
},
"name" : "title_1_description_-1",
"ns" : "[Link]"
}
]
MongoDB - Agregación
Las operaciones de agregaciones procesan registros de datos y devuelven resultados
calculados. Las operaciones de agregación agrupan valores de varios documentos y
pueden realizar una variedad de operaciones en los datos agrupados para devolver un
solo resultado. En SQL count (*) y con group by es un equivalente de la agregación
MongoDB.
El método aggregate ()
Para la agregación en MongoDB, debe usar aggregate() método.
Sintaxis
Sintaxis básica de aggregate() El método es el siguiente:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Ejemplo
En la colección tienes los siguientes datos:
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: '[Link]
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: '[Link]
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: '[Link]
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
Ahora, de la colección anterior, si desea mostrar una lista que indique cuántos tutoriales ha
escrito cada usuario, utilizará lo siguiente aggregate() método -
La consulta equivalente de SQL para el caso de uso anterior será select by_user,
count(*) from mycol group by by_user.
En el ejemplo anterior, hemos agrupado los documentos por campo. by_usery en cada
aparición del usuario se incrementa el valor anterior de la suma. A continuación se muestra
una lista de expresiones de agregación disponibles.
Concepto de tubería
En el comando UNIX, la canalización de shell significa la posibilidad de ejecutar una
operación en alguna entrada y usar la salida como entrada para el siguiente comando y así
sucesivamente. MongoDB también admite el mismo concepto en el marco de agregación.
Existe un conjunto de etapas posibles y cada una de ellas se toma como un conjunto de
documentos como entrada y produce un conjunto resultante de documentos (o el
documento JSON resultante final al final de la canalización). Esto, a su vez, se puede
utilizar para la siguiente etapa y así sucesivamente.
Las siguientes son las posibles etapas en el marco de agregación:
• $project - Se utiliza para seleccionar algunos campos específicos de una
colección.
• $match - Esta es una operación de filtrado y, por lo tanto, puede reducir la
cantidad de documentos que se dan como entrada a la siguiente etapa.
• $group - Esto hace la agregación real como se discutió anteriormente.
• $sort - Ordena los documentos.
• $skip - Con esto, es posible saltar hacia adelante en la lista de documentos para
una cantidad determinada de documentos.
• $limit - Esto limita la cantidad de documentos a mirar, por el número dado a partir
de las posiciones actuales.
• $unwind- Se utiliza para desenrollar documentos que utilizan matrices. Cuando se
usa una matriz, los datos se unen previamente y esta operación se deshará con
esto para tener documentos individuales nuevamente. Así, con esta etapa
aumentaremos la cantidad de documentos para la siguiente etapa.
MongoDB - Replicación
La replicación es el proceso de sincronizar datos en varios servidores. La replicación
proporciona redundancia y aumenta la disponibilidad de datos con múltiples copias de
datos en diferentes servidores de bases de datos. La replicación protege una base de
datos de la pérdida de un solo servidor. La replicación también le permite recuperarse de
fallas de hardware e interrupciones del servicio. Con copias adicionales de los datos,
puede dedicar una a la recuperación de desastres, generación de informes o respaldo.
Ejemplo
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
• Comenzará una instancia de mongod con el nombre rs0, en el puerto 27017.
• Ahora inicie el símbolo del sistema y conéctese a esta instancia de mongod.
• En el cliente Mongo, emita el comando [Link]() para iniciar un nuevo conjunto
de réplicas.
• Para verificar la configuración del conjunto de réplicas, emita el comando [Link]().
Para comprobar el estado del conjunto de réplicas, emita el [Link]().
Sintaxis
La sintaxis básica de [Link]() El comando es el siguiente:
>[Link](HOST_NAME:PORT)
Ejemplo
Suponga que el nombre de su instancia mongod es [Link] y se está ejecutando en
el puerto 27017. Para agregar esta instancia al conjunto de réplicas, emita el
[Link]() en el cliente Mongo.
>[Link]("[Link]")
>
Puede agregar una instancia de mongod al conjunto de réplicas solo cuando esté
conectado al nodo principal. Para verificar si está conectado al primario o no, emita el
[Link]() en cliente mongo.
MongoDB: fragmentación
Sharding es el proceso de almacenar registros de datos en múltiples máquinas y es el
enfoque de MongoDB para satisfacer las demandas del crecimiento de datos. A medida
que aumenta el tamaño de los datos, es posible que una sola máquina no sea suficiente
para almacenar los datos ni proporcionar un rendimiento de lectura y escritura aceptable.
La fragmentación resuelve el problema de la escala horizontal. Con la fragmentación,
agrega más máquinas para respaldar el crecimiento de datos y las demandas de las
operaciones de lectura y escritura.
Fragmentación en MongoDB
El siguiente diagrama muestra la fragmentación en MongoDB utilizando un clúster
fragmentado.
Sintaxis
La sintaxis básica de mongodump El comando es el siguiente:
>mongodump
Ejemplo
Inicie su servidor mongod. Suponiendo que su servidor mongod se está ejecutando en el
localhost y el puerto 27017, abra un símbolo del sistema y vaya al directorio bin de su
instancia de mongodb y escriba el comandomongodump
Considere que la colección mycol tiene los siguientes datos.
>mongodump
A continuación se muestra una lista de opciones disponibles que se pueden utilizar con
el mongodump mando.
Restaurar datos
Para restaurar los datos de respaldo de MongoDB mongorestorese utiliza el comando.
Este comando restaura todos los datos del directorio de respaldo.
Sintaxis
La sintaxis básica de mongorestore el comando es -
>mongorestore
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
> [Link]({
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "Chicago",
"state": "Illinois"
}
]
}
})
Este enfoque mantiene todos los datos relacionados en un solo documento, lo que facilita
su recuperación y mantenimiento. El documento completo se puede recuperar en una sola
consulta, como:
>[Link]({"name":"Tom Benzamin"},{"address":1})
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
Dado que todos los campos presentes en la consulta son parte de un índice, MongoDB
coincide con las condiciones de la consulta y devuelve el resultado utilizando el mismo
índice sin mirar dentro de los documentos. Dado que los índices están presentes en la
RAM, la obtención de datos de índices es mucho más rápida en comparación con la
obtención de datos mediante el escaneo de documentos.
{
"_id": ObjectId("53402597d852426020000003"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
Primero crearemos un índice compuesto para el users colección en los
campos gender y user_name usando la siguiente consulta -
>[Link]({gender:1,user_name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>[Link]({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" }
>[Link]({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }
Por último, recuerde que un índice no puede cubrir una consulta si:
Usando $ explicar
los $explainEl operador proporciona información sobre la consulta, los índices utilizados
en una consulta y otras estadísticas. Es muy útil al analizar qué tan bien están optimizados
sus índices.
En el último capítulo, ya habíamos creado un índice para el users colección en
campos gender y user_name usando la siguiente consulta -
>[Link]({gender:1,user_name:1})
{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
>[Link]({gender:"M"},{user_name:1,_id:0}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "[Link]",
"indexFilterSet" : false,
"parsedQuery" : {
"gender" : {
"$eq" : "M"
}
},
"queryHash" : "B4037D3C",
"planCacheKey" : "DEAAE17C",
"winningPlan" : {
"stage" : "PROJECTION_COVERED",
"transformBy" : {
"user_name" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"gender" : 1,
"user_name" : 1
},
"indexName" : "gender_1_user_name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"gender" : [
"[\"M\", \"M\"]"
],
"user_name" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
Usando $ hint
los $hintEl operador obliga al optimizador de consultas a utilizar el índice especificado
para ejecutar una consulta. Esto es particularmente útil cuando desea probar el
rendimiento de una consulta con diferentes índices. Por ejemplo, la siguiente consulta
especifica el índice en los camposgender y user_name que se utilizará para esta
consulta:
>[Link]({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
{ "user_name" : "tombenzamin" }
>[Link]({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
.explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "[Link]",
"indexFilterSet" : false,
"parsedQuery" : {
"gender" : {
"$eq" : "M"
}
},
"queryHash" : "B4037D3C",
"planCacheKey" : "DEAAE17C",
"winningPlan" : {
"stage" : "PROJECTION_COVERED",
"transformBy" : {
"user_name" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"gender" : 1,
"user_name" : 1
},
"indexName" : "gender_1_user_name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"gender" : [
"[\"M\", \"M\"]"
],
"user_name" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
109
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
MongoDB - Operaciones atómicas
Datos del modelo para operaciones atómicas
El enfoque recomendado para mantener la atomicidad sería mantener toda la información
relacionada, que con frecuencia se actualiza junta en un solo documento
utilizando embedded documents. Esto aseguraría que todas las actualizaciones de un
solo documento sean atómicas.
Supongamos que hemos creado una colección con el nombre productDetails e insertamos
documentos en ella como se muestra a continuación:
>[Link]("products")
{ "ok" : 1 }
> [Link](
{
"_id":1,
"product_name": "Samsung S3",
"category": "mobiles",
"product_total": 5,
"product_available": 3,
"product_bought_by": [
{
"customer": "john",
"date": "7-Jan-2014"
},
{
"customer": "mark",
"date": "8-Jan-2014"
}
]
}
)
WriteResult({ "nInserted" : 1 })
>
En este documento, hemos incorporado la información del cliente que compra el producto
en el product_bought_by campo. Ahora, cada vez que un nuevo cliente compra el
producto, primero verificaremos si el producto todavía está disponible
usandoproduct_available campo. Si está disponible, reduciremos el valor del campo
product_available e insertaremos el documento incrustado del nuevo cliente en el campo
product_bought_by. UsaremosfindAndModify comando para esta funcionalidad porque
busca y actualiza el documento al mismo tiempo.
>[Link]({
query:{_id:2,product_available:{$gt:0}},
update:{
$inc:{product_available:-1},
$push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}}
}
})
[Link](
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
)
>[Link]({"tags":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
>
> [Link]({tags:"cricket"}).pretty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}
Para verificar que se utiliza la indexación adecuada, utilice lo siguiente explain comando -
>[Link]({tags:"cricket"}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "[Link]",
"indexFilterSet" : false,
"parsedQuery" : {
"tags" : {
"$eq" : "cricket"
}
},
"queryHash" : "9D3B61A7",
"planCacheKey" : "04C9997B",
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"tags" : 1
},
"indexName" : "tags_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"tags" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"tags" : [
"[\"cricket\", \"cricket\"]
"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
>
El comando anterior resultó en "cursor": "BtreeCursor tags_1" que confirma que se utiliza
la indexación adecuada.
>[Link]({"[Link]":1,"[Link]":1,"[Link]":1
})
{
"numIndexesBefore" : 4,
"numIndexesAfter" : 4,
"note" : "all indexes already exist",
"ok" : 1
}
>
Una vez creado el índice, podemos buscar cualquiera de los campos del subdocumento
utilizando este índice de la siguiente manera:
> [Link]({"[Link]":"Los Angeles"}).pretty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}
Recuerde que la expresión de la consulta debe seguir el orden del índice especificado.
Entonces, el índice creado anteriormente admitiría las siguientes consultas:
>[Link]({"[Link]":"Los Angeles","[Link]":"California"}).p
retty()
{
"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
"address" : {
"city" : "Los Angeles",
"state" : "California",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "Tom Benzamin"
}