Búsquedas en MongoDB

por | Ene 29, 2018 | Bases de Datos, MongoDB | 5 Comentarios

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" }

 

5 Comentarios

  1. Pedro

    Gracias, pero podría estar mejor explicado ya que no se entiende bien lo que quieres decir, por ejemplo, a la hora de buscar un elemento por tipo de dato.

    Responder
    • Pedro

      Espero que tu duda este resuelta ya.

      La busqueda por tipo de dato es con el operador punto y en tipo json. Ejemplo:

      db.personas.find(‘data.sexo’:’hombre’).pretty()

      Responder
  2. CLAUDIA

    Está muy bien porque cuando queremos una guía rápida, ésto es lo que buscamos. Gracias!

    Responder
  3. Fredi

    Hola muy buena guia,

    Pero en el caso de querere solo mostrar ¿el nombre de los amigos y no la edad como sería la línea de código?

    Gracias

    Responder
  4. Welman

    Alguien me puede ayudar en darme la forma de filtrar y luego muestre documentos distintos, que no se repitan. Gracias

    Responder

Enviar un comentario

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