Arrays en MongoDB

Una de las cosas más poderosas que tiene MongoDB es la capacidad de crear registros (documentos) que tengan campos que sean arrays.

Esto nos permite representar valores anexos a un documento de una forma fácil, esto sería muy tedioso en una base de datos relacional.

Añadir un valor a un array en MongoDB

.$push() o .$addToSet

Para explicarlo vamos a partir de un documento que no posee ningún campo array. En este caso dicho documento representa información sobre una ciudad:

{
  "_id": ObjectId("525ab02733b01a66a9dcbc5f"),
  "ciudad": "Zaragoza",
  "habitantes": 679624
}

La estructura del operador .$push es la siguiente (el comando .$addToSet se usa exactamente igual):

{ $push: {  campo: elemento_a_insertar }}

Creamos un array en el que vamos a insertar información de monumentos que se puedan visitar en la ciudad. Vamos a utilizar el método update para hacerlo. Si el campo no existe se crea un campo de formato array, en el caso de que el campo exista y no sea un array se generaría un error.

update = db.ciudades.update({ ciudad: 'Zaragoza' },{$push:{monumentos:'Basílica del Pilar'}});

print('Documentos actualizados ' + update["nMatched"]);

Una vez ejecutado nos quedará el siguiente documento:

{
	"_id" : ObjectId("525ab02733b01a66a9dcbc5f"),
	"ciudad" : "Zaragoza",
	"habitantes" : 679624,
	"monumentos" : [
		"Basílica del Pilar"
	]
}

Añadir N elementos a un array en MongoDB

.$each()

Ahora vamos a añadir N elementos a un array en MongoDB pero de una sola vez. En este caso vamos a añadir más monumentos a la ciudad de Zaragoza.

Además de .$push() vamos a necesitar otro operador, en este caso de .$each()

Así la estructura de inserción quedará de la siguiente manera:

{$push:{campo:{$each:[elemento1,elemento2,...,elementoN}}}

Realizaremos la actualización del documento usando .update() y quedará de la siguiente forma:

db.ciudades.update(
    {ciudad:'Zaragoza'},
    {$push:{monumentos:
      {$each:["SEO",
              "Palacio Aljafería",
              "Murallas Romanas"]
      }
    }
});

Añadir elementos a un array en una determinada posición en MongoDB

.$position()

$push y $addToSet siempre agregan los nuevos elementos al final. Si quisiéramos indicar la posición deberíamos utilizar la siguiente sintaxis teniendo en cuenta que los índices empiezan en 0:

db.ciudades.update(
   {ciudad:'Zaragoza'},
   { $push: { monumentos: 
      {  
         $each: ['Segundo Monumento','Tercer Monumento'], 
         $position: 1
      }
   }
});

Añadir elementos a un array ordenados en MongoDB

.$sort()

Si queremos agregar un par de elementos y ordenarlos antes de insertarlos debemos usar la siguiente sintaxis:

db.ciudades.update(
   {ciudad:'Zaragoza'},
   { $push: { monumentos: 
      {  
         $each: ['B','A'], 
         $sort: 1
      }
   }
});

Borrar elementos de un array en MongoDB

.$pull() .$pullAll()

La diferencia entre $pullAll y $pull es que mientras $pullAll elimina todas las instancias de una lista de valores de un array, $pull utiliza una query para hacerlo.

Ejemplos $pull()

Ejemplo 1: El siguiente ejemplo irá por todos los documentos de la colección y eliminará del array el elemento ‘A’:

db.ciudades.update({ }, { $pull:  { monumentos: 'A' }}, { multi: true});

Ejemplo 2: El siguiente ejemplo irá al documento relacionado con la ciudad de zaragoza y eliminará del array el elemento ‘B’:

db.ciudades.update({ ciudad: 'Zaragoza' }, { $pull:  { monumentos: 'A' }}, { multi: true});

Ejemplos $pullAll()

Ejemplo 1: El siguiente ejemplo borrará del array monumentos del documento de ciudades que haga Match con Zaragoza aquellos monumentos que coincidan con la ‘Basílica del Pilar’ o el ‘Palacio Aljafería’:

db.ciudades.update({ ciudad: 'Zaragoza'}, { $pullAll: {monumentos: ['Basílica del Pilar','Palacio Aljafería']}});

Borrar elementos de un array en MongoDB mediante índice

.splice()

Con la función splice podemos eliminar el elemento que deseemos, podemos indicar el índice del elemento que queremos eliminar y el número de elementos.

Primero nos traemos en la variable data el documento relacionado con la ciudad de Zaragoza de la siguiente forma:

var ciudadZaragoza = db.ciudades.findOne({ ciudad: 'Zaragoza' });

Acto seguido vamos a usar la función indexOf para encontrar cual es el índice del elemento que queremos borrar, por ejemplo las ‘Murallas Romanas’:

var index = ciudadZaragoza.monumentos.indexOf('Murallas Romanas')

Ahora a la función splice le pasamos el índice y el número de elementos que queremos eliminar:

ciudadZaragoza.monumentos.splice(index,1)

Ojo porque estos datos no se han salvado en nuestro documento ya que estamos trabajando con variables, así que tenemos que guardarlos de la siguiente manera:

db.ciudades.save(ciudadZaragoza);

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada.