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>)
shell

En <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.

Nota

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
    }
]
)
shell

MongoDB 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 ( )
shell

Y este es el resultado correspondiente:

db.empleados.findOne ( )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Ortiz",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Buscar 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" ) } )
shell

El resultado debería ser este:

db.empleados.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
{
    _id : ObjectID ( "582pfh773813tw982qj411l0"
    name : "Jacobo",
    gender : "Male",
    age : 22,
    year : 2022
}
shell

Buscar 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" } )
shell

En el resultado aparece el empleado Ruiz:

db.empleados.findOne ( { gender : "Male" } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Ruiz",
    gender : "Male",
    age : 40,
    year : 2019
}
shell

MongoDB 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 } )
shell

El 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
}
shell

Establecer 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 } } )
shell

En 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
}
shell

Excluir 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 } )
shell

Dado 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
}
shell

Ejemplo 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" }  )
shell

Este será el resultado:

db.empleados.findOne ( { name : "Sanz" }  )
null
shell
Consejo

Para 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.

¿Le ha resultado útil este artículo?
Page top