Búsquedas en MongoDB

Comando de búsqueda

db.amigos.find({[CONSULTA_1]},{[PROYECIÓN_2]})

Este comando puede recibir dos parámetros: una consulta y una proyección. Estos comandos son opcionales.

1. Consulta de datos

Personas mayores de 25 años

db.amigos.find({"Edad": {$gt: 25}})

2. Mostrar proyección

Mostrar nombre y apellidos de las Marisas encontradas

db.amigos.find({Nombre: "Marisa" },{Nombre:1, Apellidos:2})

 

Mostar todos los datos de una colección

Formato básico

db.amigos.find()
EJEMPLO DE BASE DE DATOS UTILIZADA PARA LAS BÚSQUEDAS:
{ "_id" : ObjectId("5a6f05fbb56b58b447e66809"), "Nombre" : "Luís", "Apellidos" : "Martinez", "Edad" : 18, "Aficiones" : [ "fútbol", "senderismo", "tenis" ], "Amigos" : [ { "Nombre" : "Monica", "Edad" : 20 }, { "Nombre" : "Andrés", "Edad" : 24 } ] } 
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa", "Apellidos" : "García", "Edad" : 18, "Aficiones" : [ "senderismo", "tenis", "pintura" ], "Amigos" : [ { "Nombre" : "Monica", "Edad" : 20 } ] } 
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680b"), "Nombre" : "Joaquin", "Apellidos" : "Rodriguez", "Edad" : 18, "Aficiones" : [ "fútbol", "natación" ], "Amigos" : [ { "Nombre" : "Andrés", "Edad" : 24 } ] } 
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680c"), "Nombre" : "Luís", "Apellidos" : "Martinez", "Edad" : 28, "Aficiones" : [ "natación", "culturismo" ], "Amigos" : [ { "Nombre" : "Juan", "Edad" : 40 }, { "Nombre" : "Antonio", "Edad" : 52 } ] }

 

Formato más legible

db.amigos.find().pretty()
{
	"_id" : ObjectId("5a6f05fbb56b58b447e66809"),
	"Nombre" : "Luís",
	"Apellidos" : "Martinez",
	"Edad" : 18,
	"Aficiones" : [
		"fútbol",
		"senderismo",
		"tenis"
	],
	"Amigos" : [
		{
			"Nombre" : "Monica",
			"Edad" : 20
		},
		{
			"Nombre" : "Andrés",
			"Edad" : 24
		}
	]
}
...

Operaciones de comparación

Mayor que

Mostrar nombre y apellidos de los mayores de 25 años

db.amigos.find({"Edad": {$gt: 25}},{Nombre:1, Apellidos:2})
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680c"), "Nombre" : "Luís", "Apellidos" : "Martinez" }

Menor que

Mostrar nombre y apellidos de los menores de 25 años

db.amigos.find({"Edad": {$lt: 25}},{Nombre:1, Apellidos:2})
{ "_id" : ObjectId("5a6f05fbb56b58b447e66809"), "Nombre" : "Luís", "Apellidos" : "Martinez" }
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa", "Apellidos" : "García" }
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680b"), "Nombre" : "Joaquin", "Apellidos" : "Rodriguez" }

Operadores de existencia y tipo

Como MongoDB es una base de datos sin esquema, cada documento puede tener distintos campos e incluso estos campos pueden ser de distintos tipos.

Existencia

Por esto es muy habitual usar en las consultas una operación que nos indique la existencia de un campo.

db.amigos.insert({ Nombre: "Natalia", Edad: 18, Aficiones: ["pintura"] })
db.amigos.find({Apellidos:{$exists:false}},{Nombre:1})
{ "_id" : ObjectId("5a6f49aab56b58b447e6680f"), "Nombre" : "Natalia" }

Tipo

Si queremos hacer una consulta por tipo de dato usaríamos:

db.amigos.find({Apellidos:{$type:2}},{Nombre:1})

{ "_id" : ObjectId("5a6f05fbb56b58b447e66809"), "Nombre" : "Luís" }
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa" }
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680b"), "Nombre" : "Joaquin" }
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680c"), "Nombre" : "Luís" }

Operaciones lógicas:

Disyunción Y ($and)

db.amigos.find(
  { 
    $and: 
      [ 
        {Edad: {$gt:17}}, 
        {Nombre: "Marisa" } 
      ] 
  }
)
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa", "Apellidos" : "García", "Edad" : 18, "Aficiones" : [ "senderismo", "tenis", "pintura" ], "Amigos" : [ { "Nombre" : "Monica", "Edad" : 20 } ] }

Conjunción O ($or)

db.amigos.find(
  { 
    $or: 
      [ 
        {Edad: {$gt: 20}}, 
        {Nombre: "Marisa" } 
      ] 
  }
)

{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa", "Apellidos" : "García", "Edad" : 18, "Aficiones" : [ "senderismo", "tenis", "pintura" ], "Amigos" : [ { "Nombre" : "Monica", "Edad" : 20 } ] }
{ "_id" : ObjectId("5a6f08e5b56b58b447e6680c"), "Nombre" : "Luís", "Apellidos" : "Martinez", "Edad" : 28, "Aficiones" : [ "natación", "culturismo" ], "Amigos" : [ { "Nombre" : "Juan", "Edad" : 40 }, { "Nombre" : "Antonio", "Edad" : 52 } ] }

Negación NO ($not)

db.amigos.find( {Edad:{$not: {$gt:23}}})

Negación NO ($nor)

Acepta dos o mas valores

db.amigos.find({$nor:[{Edad:{$gt:23}}, {Nombre: "Marisa"}]}) 

Operaciones sobre sub-documentos

db.inventario.insert([
   { "_id" : 1, "Nombre" : "peras", descripcion: "producto 1", "stock" : 220 },
   { "_id" : 2, "Nombre" : "manzanas", descripcion: "producto 2", "stock" : 91 },
   { "_id" : 3, "Nombre" : "naranjas", descripcion: "producto 3", "stock" : 72 },
   { "_id" : 4, "Nombre" : "platinos", descripcion: "producto 4", "stock" : 32 },
   { "_id" : 5, "Nombre": null, descripcion: "Incompleta" },
   { "_id" : 6 }
])
db.compras.insert([
   { "_id" : 1, "Item" : "peras", "precio" : 12, "cantidad" : 2 },
   { "_id" : 2, "Item" : "manzanas", "precio" : 20, "cantidad" : 1 },
   { "_id" : 3  }
])
db.compras.aggregate([ 
  { $lookup: 
    { 
      from: "inventario", 
      localField: "Item", 
      foreignField: "Nombre", 
      as: "inventario_docs" 
     } 
   } 
])

Expresiones regulares: $regex

db.amigos.find({"Nombre": {$regex:".*a$"}},{Nombre:1})
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa" }
{ "_id" : ObjectId("5a6f49aab56b58b447e6680f"), "Nombre" : "Natalia" }

Operaciones sobre arrays

Contar

b.amigos.find().count()
4

Ordenar descendente

db.amigos.find({},{Nombre:1}).sort({Nombre:1})
{ "_id" : ObjectId("5a6f090db56b58b447e6680d"), "Nombre" : "Joaquin" }
{ "_id" : ObjectId("5a6f05fbb56b58b447e66809"), "Nombre" : "Luís" }
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa" }
{ "_id" : ObjectId("5a6f49aab56b58b447e6680f"), "Nombre" : "Natalia" }

Ordenar ascendente

db.amigos.find({},{Nombre:1}).sort({Nombre:-1})
{ "_id" : ObjectId("5a6f49aab56b58b447e6680f"), "Nombre" : "Natalia" }
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa" }
{ "_id" : ObjectId("5a6f05fbb56b58b447e66809"), "Nombre" : "Luís" }
{ "_id" : ObjectId("5a6f090db56b58b447e6680d"), "Nombre" : "Joaquin" }

Limitar la búsqueda

db.amigos.find({},{Nombre:1}).sort({Nombre:1}).limit(2)
{ "_id" : ObjectId("5a6f090db56b58b447e6680d"), "Nombre" : "Joaquin" }
{ "_id" : ObjectId("5a6f05fbb56b58b447e66809"), "Nombre" : "Luís" }

Buscar a partir del X

db.amigos.find({},{Nombre:1}).sort({Nombre:1}).skip(2)
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa" }
{ "_id" : ObjectId("5a6f49aab56b58b447e6680f"), "Nombre" : "Natalia" }

Crear un array con los elementos de salida

db.compras.find({},{Nombre:1}).toArray()
{ "_id" : ObjectId("5a6f06fab56b58b447e6680a"), "Nombre" : "Marisa" }
{ "_id" : ObjectId("5a6f49aab56b58b447e6680f"), "Nombre" : "Natalia" }

 

Otros artículos que pueden ser de interés:

Autor: Diego Calvo