all repos — gemini-redirect @ 0b267f51260b59f9c40f193d688f4c01f696328f

blog/mdad/mongodb-operaciones-basicas-y-arquitectura/index.html (view raw)

  1<!DOCTYPE html>
  2<html>
  3<head>
  4<meta charset="utf-8" />
  5<meta name="viewport" content="width=device-width, initial-scale=1" />
  6<title>MongoDB: Operaciones Básicas y Arquitectura</title>
  7<link rel="stylesheet" href="../css/style.css">
  8</head>
  9<body>
 10<main>
 11<p>Este es el segundo post en la serie sobre MongoDB, con una breve descripción de las operaciones básicas (tales como inserción, recuperación e indexado), y ejecución por completo junto con el modelo de datos y arquitectura.</p>
 12<div class="date-created-modified">Created 2020-03-05<br>
 13Modified 2020-03-20</div>
 14<p>Otros posts en esta serie:</p>
 15<ul>
 16<li><a href="/blog/mdad/mongodb-introduction/">MongoDB: Introducción</a></li>
 17<li><a href="/blog/mdad/mongodb-operaciones-basicas-y-arquitectura/">MongoDB: Operaciones Básicas y Arquitectura</a> (este post)</li>
 18</ul>
 19<p>Este post está hecho en colaboración con un compañero, y en él veremos algunos ejemplos de las operaciones básicas (<a href="https://stackify.com/what-are-crud-operations/">CRUD</a>) sobre MongoDB.</p>
 20<hr />
 21<p>Empezaremos viendo cómo creamos una nueva base de datos dentro de MongoDB y una nueva colección donde poder insertar nuestros documentos.</p>
 22<h2 class="title" id="creación_de_una_base_de_datos_e_inserción_de_un_primer_documento"><a class="anchor" href="#creación_de_una_base_de_datos_e_inserción_de_un_primer_documento">¶</a>Creación de una base de datos e inserción de un primer documento</h2>
 23<p>Podemos ver las bases de datos que tenemos disponibles ejecutando el comando:</p>
 24<pre><code>&gt; show databases
 25admin   0.000GB
 26config  0.000GB
 27local   0.000GB
 28</code></pre>
 29<p>Para crear una nueva base de datos, o utilizar una de las que tenemos creadas ejecutamos <code>use</code> junto con el nombre que le vamos a dar:</p>
 30<pre><code>&gt; use new_DB
 31switched to db new_DB
 32</code></pre>
 33<p>Una vez hecho esto, podemos ver que si volvemos a ejecutar «show databases», la nueva base de datos no aparece. Esto es porque para que Mongo registre una base de datos en la lista de las existentes, necesitamos insertar al menos un nuevo documento en una colección de esta. Lo podemos hacer de la siguiente forma:</p>
 34<pre><code>&gt; db.movie.insert({&quot;name&quot;:&quot;tutorials point&quot;})
 35WriteResult({ &quot;nInserted&quot; : 1 })
 36
 37&gt; show databases
 38admin       0.000GB
 39config      0.000GB
 40local       0.000GB
 41movie       0.000GB
 42</code></pre>
 43<p>Al igual que podemos ver las bases de datos existentes, también podemos consultar las colecciones que existen dentro de estas. Siguiendo la anterior ejecución, si ejecutamos:</p>
 44<pre><code>&gt; show collections
 45movie
 46</code></pre>
 47<h3 id="borrar_base_de_datos"><a class="anchor" href="#borrar_base_de_datos">¶</a>Borrar base de datos</h3>
 48<p>Para borrar una base de datos tenemos que ejecutar el siguiente comando:</p>
 49<pre><code>&gt; db.dropDatabase()
 50{ &quot;dropped&quot; : &quot;new_DB&quot;, &quot;ok&quot; : 1 }
 51</code></pre>
 52<h3 id="crear_colección"><a class="anchor" href="#crear_colección">¶</a>Crear colección</h3>
 53<p>Para crear una colección podemos hacerlo de dos formas. O bien mediante el comando:</p>
 54<pre><code>db.createCollection(&lt;nombre de la colección&gt;, opciones)
 55</code></pre>
 56<p>Donde el primer parámetro es el nombre que le queremos asignar a la colección, y los siguientes, todos opcionales, pueden ser (entre otros):</p>
 57<table class="">
 58 <thead>
 59  <tr>
 60   <th>
 61    Campo
 62   </th>
 63   <th>
 64    Tipo
 65   </th>
 66   <th>
 67    Descripción
 68   </th>
 69  </tr>
 70 </thead>
 71 <tbody>
 72  <tr>
 73   <td>
 74    <code>
 75     capped
 76    </code>
 77   </td>
 78   <td>
 79    Booleano
 80   </td>
 81   <td>
 82    Si es
 83    <code>
 84     true
 85    </code>
 86    ,
 87 permite una colección limitada. Una colección limitada es una colección
 88 de tamaño fijo que sobrescribe automáticamente sus entradas más 
 89antiguas cuando alcanza su tamaño máximo. Si especifica
 90    <code>
 91     true
 92    </code>
 93    , también debe especificar el parámetro de
 94    <code>
 95     size
 96    </code>
 97    .
 98   </td>
 99  </tr>
100  <tr>
101   <td>
102    <code>
103     autoIndexId
104    </code>
105   </td>
106   <td>
107    Booleano
108   </td>
109   <td>
110    Si es
111    <code>
112     true
113    </code>
114    crea automáticamente un índice en el campo
115    <code>
116     _id
117    </code>
118    . Por defecto es
119    <code>
120     false
121    </code>
122   </td>
123  </tr>
124  <tr>
125   <td>
126    <code>
127     size
128    </code>
129   </td>
130   <td>
131    Número
132   </td>
133   <td>
134    Especifica el tamaño máximo en bytes para una colección limitada. Es obligatorio si el campo
135    <code>
136     capped
137    </code>
138    está a
139    <code>
140     true
141    </code>
142    .
143   </td>
144  </tr>
145  <tr>
146   <td>
147    <code>
148     max
149    </code>
150   </td>
151   <td>
152    Número
153   </td>
154   <td>
155    Especifica el número máximo de documentos que están permitidos en la colección limitada.
156   </td>
157  </tr>
158 </tbody>
159</table>
160<pre><code>&gt; use test
161switched to db test
162
163&gt; db.createCollection(&quot;mycollection&quot;)
164{ &quot;ok&quot; : 1 }
165
166&gt; db.createCollection(&quot;mycol&quot;, {capped : true, autoIndexId: true, size: 6142800, max: 10000})
167{
168    &quot;note&quot; : &quot;the autoIndexId option is deprecated and will be removed in a future release&quot;,
169    &quot;ok&quot; : 1
170}
171
172&gt; show collections
173mycol
174mycollection
175</code></pre>
176<p>Como se ha visto anteriormente al crear la base de datos, podemos insertar un documento en una colección sin que la hayamos creado anteriormente. Esto es porque MongoDB crea automáticamente una colección cuando insertas algún documento en ella:</p>
177<pre><code>&gt; db.tutorialspoint.insert({&quot;name&quot;:&quot;tutorialspoint&quot;})
178WriteResult({ &quot;nInserted&quot; : 1 })
179
180&gt; show collections
181mycol
182mycollection
183tutorialspoint
184</code></pre>
185<h3 id="borrar_colección"><a class="anchor" href="#borrar_colección">¶</a>Borrar colección</h3>
186<p>Para borrar una colección basta con situarnos en la base de datos que la contiene, y ejecutar lo siguiente:</p>
187<pre><code>db.&lt;nombre_de_la_colección&gt;.drop()
188</code></pre>
189<pre><code>&gt; db.mycollection.drop()
190true
191
192&gt; show collections
193mycol
194tutorialspoint
195</code></pre>
196<h3 id="insertar_documento"><a class="anchor" href="#insertar_documento">¶</a>Insertar documento</h3>
197<p>Para insertar datos en una colección de MongoDB necesitaremos usar el método <code>insert()</code> o <code>save()</code>.</p>
198<p>Ejemplo del método <code>insert</code>:</p>
199<pre><code>&gt; db.colection.insert({
200... title: 'Esto es una prueba para MDAD',
201... description: 'MongoDB es una BD no SQL',
202... by: 'Classmate and Me',
203... tags: ['mongodb', 'database'],
204... likes: 100
205... })
206WriteResults({ &quot;nInserted&quot; : 1 })
207</code></pre>
208<p>En este ejemplo solo se ha insertado un único documento, pero podemos insertar los que queramos separándolos de la siguiente forma:</p>
209<pre><code>db.collection.insert({documento}, {documento2}, {documento3})
210</code></pre>
211<p>No hace falta especificar un ID ya que el propio mongo asigna un ID a cada documento automáticamente, aunque nos da la opción de poder asignarle uno mediante el atributo <code>_id</code> en la inserción de los datos</p>
212<p>Como se indica en el título de este apartado también se puede insertar mediante el método <code>db.coleccion.save(documento)</code>, funcionando este como el método <code>insert</code>.</p>
213<h3 id="método_"><a class="anchor" href="#método_">¶</a>Método <code>find()</code></h3>
214<p>El método find en MongoDB es el que nos permite realizar consultas a las colecciones de nuestra base de datos:</p>
215<pre><code>db.&lt;nombre_de_la_colección&gt;.find()
216</code></pre>
217<p>Este método mostrará de una forma no estructurada todos los documentos de la colección. Si le añadimos la función <code>pretty</code> a este método, se mostrarán de una manera más «bonita».</p>
218<pre><code>&gt; db.colection.find()
219{ &quot;_id&quot;: ObjectId(&quot;5e738f0989f85a7eafdf044a&quot;), &quot;title&quot; : &quot;Esto es una prueba para MDAD&quot;, &quot;description&quot; : &quot;MongoDB es una BD no SQL&quot;, &quot;by&quot; : &quot;Classmate and Me&quot;, &quot;tags&quot; : [ &quot;mongodb&quot;, &quot;database&quot; ], &quot;likes&quot; : 100 }
220
221&gt; db.colection.find().pretty()
222{
223    &quot;_id&quot;: ObjectId(&quot;5e738f0989f85a7eafdf044a&quot;),
224    &quot;title&quot; : &quot;Esto es una prueba para MDAD&quot;,
225    &quot;description&quot; : &quot;MongoDB es una BD no SQL&quot;,
226    &quot;by&quot; : &quot;Classmate and Me&quot;,
227    &quot;tags&quot; : [
228        &quot;mongodb&quot;,
229        &quot;database&quot;
230    ],
231    &quot;likes&quot; : 100
232}
233</code></pre>
234<p>Los equivalentes del <code>where</code> en las bases de datos relacionales son:</p>
235<table class="">
236 <thead>
237  <tr>
238   <th>
239    Operación
240   </th>
241   <th>
242    Sintaxis
243   </th>
244   <th>
245    Ejemplo
246   </th>
247   <th>
248    Equivalente en RDBMS
249   </th>
250  </tr>
251 </thead>
252 <tbody>
253  <tr>
254   <td>
255    Igual
256   </td>
257   <td>
258    <code>
259     {&lt;clave&gt;:&lt;valor&gt;}
260    </code>
261   </td>
262   <td>
263    <code>
264     db.mycol.find({"by":"Classmate and Me"})
265    </code>
266   </td>
267   <td>
268    <code>
269     where by = 'Classmate and Me'
270    </code>
271   </td>
272  </tr>
273  <tr>
274   <td>
275    Menor que
276   </td>
277   <td>
278    <code>
279     {&lt;clave&gt;:{$lt:&lt;valor&gt;}}
280    </code>
281   </td>
282   <td>
283    <code>
284     db.mycol.find({"likes":{$lt:60}})
285    </code>
286   </td>
287   <td>
288    <code>
289     where likes &lt; 60
290    </code>
291   </td>
292  </tr>
293  <tr>
294   <td>
295    Menor o igual que
296   </td>
297   <td>
298    <code>
299     {&lt;clave&gt;:{$lte:&lt;valor&gt;}}
300    </code>
301   </td>
302   <td>
303    <code>
304     db.mycol.find({"likes":{$lte:60}})
305    </code>
306   </td>
307   <td>
308    <code>
309     where likes &lt;= 60
310    </code>
311   </td>
312  </tr>
313  <tr>
314   <td>
315    Mayor que
316   </td>
317   <td>
318    <code>
319     {&lt;clave&gt;:{$gt:&lt;valor&gt;}}
320    </code>
321   </td>
322   <td>
323    <code>
324     db.mycol.find({"likes":{$gt:60}})
325    </code>
326   </td>
327   <td>
328    <code>
329     where likes &gt; 60
330    </code>
331   </td>
332  </tr>
333  <tr>
334   <td>
335    Mayor o igual que
336   </td>
337   <td>
338    <code>
339     {&lt;clave&gt;:{$gte:&lt;valor&gt;}}
340    </code>
341   </td>
342   <td>
343    <code>
344     db.mycol.find({"likes":{$gte:60}})
345    </code>
346   </td>
347   <td>
348    <code>
349     where likes &gt;= 60
350    </code>
351   </td>
352  </tr>
353  <tr>
354   <td>
355    No igual
356   </td>
357   <td>
358    <code>
359     {&lt;clave&gt;:{$ne:&lt;valor&gt;}}
360    </code>
361   </td>
362   <td>
363    <code>
364     db.mycol.find({"likes":{$ne:60}})
365    </code>
366   </td>
367   <td>
368    <code>
369     where likes != 60
370    </code>
371   </td>
372  </tr>
373 </tbody>
374</table>
375<p>En el método <code>find()</code> podemos añadir condiciones AND y OR de la siguiente manera:</p>
376<pre><code>(AND)
377&gt; db.colection.find({$and:[{&quot;by&quot;:&quot;Classmate and Me&quot;},{&quot;title&quot;: &quot;Esto es una prueba para MDAD&quot;}]}).pretty()
378
379(OR)
380&gt; db.colection.find({$or:[{&quot;by&quot;:&quot;Classmate and Me&quot;},{&quot;title&quot;: &quot;Esto es una prueba para MDAD&quot;}]}).pretty()
381
382(Ambos a la vez)
383&gt; db.colection.find({&quot;likes&quot;: {$gt:10}, $or: [{&quot;by&quot;: &quot;Classmate and Me&quot;}, {&quot;title&quot;: &quot;Esto es una prueba para MDAD&quot;}]}).pretty()
384</code></pre>
385<p>La última llamada con ambos a la vez equivalente en una consulta SQL a:</p>
386<pre><code>where likes&gt;10 AND (by = 'Classmate and Me' OR title = 'Esto es una prueba para MDAD')
387</code></pre>
388<h3 id="actualizar_un_documento"><a class="anchor" href="#actualizar_un_documento">¶</a>Actualizar un documento</h3>
389<p>En MongoDB se hace utilizando el método <code>update</code>:</p>
390<pre><code>db.&lt;nombre_colección&gt;.update(&lt;criterio_de_selección&gt;, &lt;dato_actualizado&gt;)
391</code></pre>
392<p>Para este ejemplo vamos a actualizar el documento que hemos insertado en el apartado anterior:</p>
393<pre><code>&gt; db.colection.update({'title':'Esto es una prueba para MDAD'},{$set:{'title':'Título actualizado'}})
394WriteResult({ &quot;nMatched&quot; : 1, &quot;nUpserted&quot; : 0, &quot;nModified&quot; : 1 })
395&gt; db.colection.find().pretty()
396{
397    &quot;_id&quot;: ObjectId(&quot;5e738f0989f85a7eafdf044a&quot;),
398    &quot;title&quot; : &quot;Título actualizado&quot;,
399    &quot;description&quot; : &quot;MongoDB es una BD no SQL&quot;,
400    &quot;by&quot; : &quot;Classmate and Me&quot;,
401    &quot;tags&quot; : [
402        &quot;mongodb&quot;,
403        &quot;database&quot;
404    ],
405    &quot;likes&quot; : 100
406}
407</code></pre>
408<p>Anteriormente se ha mencionado el método <code>save()</code> para la inserción de documentos, pero también podemos utilizarlo para sustituir documentos enteros por uno nuevo:</p>
409<pre><code>&gt; db.&lt;nombre_de_la_colección&gt;.save({_id:ObjectId(), &lt;nuevo_documento&gt;})
410</code></pre>
411<p>Con nuestro documento:</p>
412<pre><code>&gt; db.colection.save(
413...   {
414...     &quot;_id&quot;: ObjectId(&quot;5e738f0989f85a7eafdf044a&quot;), &quot;title&quot;: &quot;Este es el nuevo título&quot;, &quot;by&quot;: &quot;MDAD&quot;
415...   }
416... )
417WriteResult({ &quot;nMatched&quot; : 1, &quot;nUpserted&quot; : 0, &quot;nModified&quot; : 1 })
418
419&gt; db.colection.find()
420{
421    &quot;_id&quot;: ObjectId(&quot;5e738f0989f85a7eafdf044a&quot;),
422    &quot;title&quot;: &quot;Este es el nuevo título&quot;,
423    &quot;by&quot;: &quot;MDAD&quot;
424}
425</code></pre>
426<h3 id="borrar_documento"><a class="anchor" href="#borrar_documento">¶</a>Borrar documento</h3>
427<p>Para borrar un documento utilizaremos el método <code>remove()</code> de la siguiente manera:</p>
428<pre><code>db.&lt;nombre_de_la_colección&gt;.remove(&lt;criterio_de_borrado&gt;)
429</code></pre>
430<p>Considerando la colección del apartado anterior borraremos el único documento que tenemos:</p>
431<pre><code>&gt; db.colection.remove({'title': 'Este es el nuevo título'})
432WriteResult({ &quot;nRemoved&quot; : 1 })
433&gt; db.colection.find().pretty()
434&gt;
435</code></pre>
436<p>Para borrar todos los documentos de una colección usamos:</p>
437<pre><code>db.&lt;colección&gt;.remove({})
438</code></pre>
439<h3 id="indexación"><a class="anchor" href="#indexación">¶</a>Indexación</h3>
440<p>MongDB nos permite crear índices sobre atributos de una colección de la siguiente forma:</p>
441<pre><code>db.&lt;colección&gt;.createIndex( {&lt;atributo&gt;:&lt;opciones&gt;})
442</code></pre>
443<p>Como ejemplo:</p>
444<pre><code>&gt; db.mycol.createIndex({&quot;title&quot;:1})
445{
446    &quot;createdCollectionAutomatically&quot; : false,
447    &quot;numIndexesBefore&quot; : 1,
448    &quot;numIndexesAfter&quot; : 2,
449    &quot;ok&quot; : 1
450}
451</code></pre>
452<p>Si queremos más de un atributo en el índice lo haremos así:</p>
453<pre><code>&gt; db.mycol.ensureIndex({&quot;title&quot;:1,&quot;description&quot;:-1})
454</code></pre>
455<p>Los valores que puede tomar son <code>+1</code> para ascendente o <code>-1</code> para descendente.</p>
456<h3 id="referencias"><a class="anchor" href="#referencias">¶</a>Referencias</h3>
457<ul>
458<li>Manual MongoDB. (n.d.). <a href="https://docs.mongodb.com/manual/">https://docs.mongodb.com/manual/</a></li>
459<li>MongoDB Tutorial – Tutorialspoint. (n.d.). – <a href="https://www.tutorialspoint.com/mongodb/index.htm">https://www.tutorialspoint.com/mongodb/index.htm</a></li>
460</ul>
461</main>
462</body>
463</html>
464