MongoDB findOne: instrucciones con ejemplos
El método MongoDB findOne es muy eficaz cuando hay que buscar dentro de una colección. Sin embargo, devuelve un solo resultado, por lo que no es adecuado para todas las necesidades.
¿Qué es MongoDB findOne?
MongoDB es un sistema gestor de bases de datos capaz de manejar grandes cantidades de datos de manera eficiente gracias a su enfoque NoSQL y su escalabilidad. Pese a ofrecer grandes ventajas, también requiere métodos sólidos para que los usuarios puedan mantener la visibilidad sobre la base de datos al trabajar con ella.
El sistema almacena datos de todo tipo en forma de documento BSON (JSON binario) y agrupa estos documentos como colecciones. Si quieres buscar y obtener uno de estos documentos, tienes varias posibilidades. Además de la más habitual MongoDB find, MongoDB findOne es un método particularmente eficaz para filtrar con precisión incluso bases de datos extensas.
MongoDB findOne realiza búsquedas en todos los documentos y colecciones considerados según criterios que puede especificar el usuario. La particularidad del método es que siempre devuelve un solo documento que corresponde a los parámetros almacenados. Si solo hay un documento que coincide con la búsqueda, se toma ese documento. Si hay varios documentos que coinciden, MongoDB findOne devuelve el documento que aparece en primer lugar en el orden natural de la base de datos. Si no se encuentra ningún documento en la búsqueda, el resultado es “cero”.
Sintaxis y particularidades de MongoDB findOne
La sintaxis básica de MongoDB findOne es sencilla. El método se utiliza siempre de la siguiente manera:
db.collection.findOne (<query>, <projection>, <options>)
shellEn <query>
se indican los parámetros de búsqueda según los que el método debe filtrar los documentos. Esta entrada es opcional. Las entradas en <projection>
determinan qué campos deben tenerse en cuenta para el documento mostrado. Los valores permitidos para el resultado son los booleanos 1 (verdadero) y 0 (falso). Si este dato se deja en blanco, se mostrarán todos los campos. También es opcional. <options>
, también opcional, permite modificar aún más la búsqueda y cambiar la visualización.
Para buscar colecciones con múltiples parámetros de búsqueda de forma eficaz, existen las MongoDB Queries, que explicaremos en más detalle en otro artículo. Las consultas o Queries se basan en el comando MongoDB find.
Crear una colección de prueba
Si has instalado MongoDB en Linux, Windows o Mac y quieres utilizar MongoDB findOne, vale la pena configurar un entorno de prueba para la primera vez que utilices el método. Te mostramos los primeros pasos con la base de datos en nuestro tutorial de MongoDB. En nuestro ejemplo, vamos a imaginar una base de datos de empleados que contiene cinco entradas e información sobre el nombre, el sexo, la edad del empleado y cuánto tiempo lleva trabajando en la empresa. Esta colección tiene el siguiente aspecto:
db.empleados.insertMany ( [
{
name : "Ortiz",
gender : "Female",
age : 56,
year : 2002
},
{
name : "Murillo",
gender : "Female",
age : 40,
year : 2017,
},
{
name : "Ruiz",
gender : "Male",
age : 40,
year : 2019
},
{
name : "Muñoz",
gender : "Female",
age : 44,
year : 2015
},
name : "Jacobo",
gender : "Male",
age : 22,
year : 2022
}
]
)
shellMongoDB findOne: búsqueda sin parámetros
Si ahora utilizas el método findOne de MongoDB sin ningún parámetro, el sistema buscará en su base de datos y encontrará cinco entradas que deberá tomar. Como no se excluyen documentos, los cinco empleados son elegibles. Por ello, MongoDB findOne seleccionaría a la primera persona introducida en la base de datos, porque el método solo devuelve un resultado. Esta es la apariencia que tendría en nuestro ejemplo:
db.empleados.findOne ( )
shellY este es el resultado correspondiente:
db.empleados.findOne ( )
{
_id : ObjectID ( "529ete7300of4002bme148om" ),
name : "Ortiz",
gender : "Female",
age : 56,
year : 2002
}
shellBuscar entradas por ID
No obstante, lo normal es que quieras especificar tu búsqueda para no acabar con cualquier documento y obtener el que realmente necesitas. MongoDB findOne también ofrece herramientas adecuadas para ello. Un método muy seguro es realizar una búsqueda por ID. El campo _id es único en cada documento y, por tanto, siempre puede asignarse exactamente a un empleado o una empleada en nuestro ejemplo. Por lo tanto, al ejecutar MongoDB findOne utilizando el ID del objeto, obtendrás el resultado correcto. En nuestro ejemplo, se vería así:
db.empleados.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
shellEl resultado debería ser este:
db.empleados.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
{
_id : ObjectID ( "582pfh773813tw982qj411l0"
name : "Jacobo",
gender : "Male",
age : 22,
year : 2022
}
shellBuscar campos especiales con MongoDB findOne
Si no conoces el ID o prefieres buscar tu colección utilizando otros parámetros, también puedes buscar filtrando por campos especiales gracias a MongoDB findOne. En este caso, ocurre lo mismo: si solo hay un documento que coincida con el parámetro, se mostrará. Sin embargo, si varios documentos coinciden con los criterios de búsqueda, el sistema solo mostrará la primera entrada. En nuestro ejemplo, por tanto, buscamos todas las entradas que indiquen “Male” (hombre) como sexo. En teoría, tendríamos dos resultados, pero solo se muestra el primero. Así es como debe figurar el comando:
db.empleados.findOne ( { gender : "Male" } )
shellEn el resultado aparece el empleado Ruiz:
db.empleados.findOne ( { gender : "Male" } )
{
_id : ObjectID ( "498p0t173mv489fh63th00kh"
name : "Ruiz",
gender : "Male",
age : 40,
year : 2019
}
shellMongoDB findOne: especificar búsqueda
Por supuesto, también puedes acotar más la búsqueda para evitar solapamientos. Esto quizá no sea necesario en una colección pequeña como la de nuestro ejemplo, pero sí es muy buena opción cuando tienes que trabajar con varios cientos o incluso miles de entradas. MongoDB findOne te permite utilizar varios campos en la búsqueda. Si eliges identificar a un empleado por género (hombre) y edad, este es el aspecto que tendrá:
db.empleados.findOne ( { gender : "Male", age: 40 } )
shellEl resultado vuelve a mostrar al empleado Ruiz, que es la única persona de la colección que es hombre y tiene 40 años. La empleada Murillo tendría la misma edad, pero es mujer. El resultado tendría el siguiente aspecto:
db.empleados.findOne ( { gender : "Male", age: 40 } )
{
_id : ObjectID ( "498p0t173mv489fh63th00kh"
name : "Ruiz",
gender : "Male",
age : 40,
year : 2019
}
shellEstablecer condiciones para un campo
También es posible establecer condiciones para un campo específico y utilizarlas como criterio de búsqueda. En el siguiente ejemplo, solo tenemos en cuenta a las personas mayores de 30 años.
Se escribiría así:
db.empleados.findOne ( { age : { $gt : 30 } } )
shellEn este caso, el empleado Jacobo queda excluido. Como la señora Ortiz cumple el criterio y es la primera persona de la lista, vuelve a mostrarse:
db.empleados.findOne ( { age : { $gt : 30 } } )
{
_id : ObjectID ( "529ete7300of4002bme148om" ),
name : "Ortiz",
gender : "Female",
age : 56,
year : 2002
}
shellExcluir campos con MongoDB findOne
El resultado puede resultar confuso en algunos casos, especialmente en colecciones extensas que además contienen mucha información. Por eso, MongoDB findOne ofrece la posibilidad de excluir campos individuales del resultado. En el siguiente ejemplo, no queremos que se muestren el ID, el sexo ni la edad.
db.empleados.findOne ( { name : "Ortiz" }, { _id : 0, gender : 0, age : 0 } )
shellDado que se muestran todos los otros datos, obtendrás este resultado:
db.empleados.findOne ( { name : "Ortiz" }, { _id : 0, gender : 0, age : 0 } )
{
name : "Ortiz",
year : 2002
}
shellEjemplo de una búsqueda fallida
Si no hay resultados para la búsqueda con MongoDB findOne, esto también se indicará. Busquemos, por ejemplo, al empleado Sanz, que no figura en la colección:
db.empleados.findOne ( { name : "Sanz" } )
shellEste será el resultado:
db.empleados.findOne ( { name : "Sanz" } )
null
shellPara gestionar fácilmente tu base de datos, puedes utilizar la interfaz gráfica de usuario gratuita MongoDB Compass, de la que hablamos en otro artículo.