HOWTO · MongoDB

Consulta con múltiples condiciones en MongoDB

Esta publicación instructiva le dirá qué operadores se pueden usar para buscar y consultar múltiples documentos en múltiples condiciones en MongoDB. Los operadores $and y $or se describen brevemente.

En esta página

Usa find() con un documento de filtro para consultar MongoDB con varias condiciones. De forma predeterminada, los campos de un mismo filtro se combinan con AND. Usa $or cuando pueda coincidir cualquiera de las cláusulas indicadas, $and cuando deban coincidir todas y $in para comprobar varias alternativas de igualdad en un mismo campo.

Cómo combina MongoDB las condiciones de una consulta

Un filtro de consulta indica qué documentos se deben devolver. Por ejemplo, db.inventory.find({ quantity: { $gt: 10 }, price: { $lt: 20 } }) coincide con los documentos de inventario cuya cantidad es superior a 10 y cuyo precio es inferior a 20. MongoDB combina implícitamente con AND las condiciones de esos campos, por lo que en este caso no hace falta usar $and de forma explícita.

Los ejemplos de la shell suponen que db.inventory contiene estos tres documentos: { item: "notebook", quantity: 30, price: 12 }, { item: "pen", quantity: 80, price: 20 } y { item: "folder", quantity: 80, price: 8 }. La primera consulta coincide con notebook y folder: la cantidad de ambos supera 10 y sus precios son inferiores a 20. El precio de pen es 20, así que no cumple esa condición. La misma regla se aplica al añadir más campos al filtro: todas las condiciones deben coincidir. Por eso, un filtro sencillo es el punto de partida más claro para consultar documentos que cumplan «todas estas condiciones». Asegúrate de que los nombres de los campos y sus valores coincidan con los documentos de tu colección; los nombres de campo de MongoDB distinguen entre mayúsculas y minúsculas.

Usa $or para que coincida cualquier condición

$or selecciona los documentos que coinciden con al menos una de las cláusulas de su matriz. Por ejemplo, db.inventory.find({ $or: [{ quantity: { $lt: 51 } }, { price: 20 }] }) devuelve un documento si su cantidad es inferior a 51 o su precio es igual a 20. El predicado { price: 20 } comprueba la igualdad; no significa que el precio sea inferior a 20. Para expresar una comparación, usa un operador como $lt.

Este es un pequeño ejemplo local de la regla «cualquier condición»:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

inventory = [
    {"item": "notebook", "quantity": 30, "price": 12},
    {"item": "pen", "quantity": 80, "price": 20},
    {"item": "folder", "quantity": 80, "price": 8},
]
matched = [
    item["item"]
    for item in inventory
    if item["quantity"] < 51 or item["price"] == 20
]
print(matched)
['notebook', 'pen']

Este fragmento de Python aplica la lógica de selección a una lista local de Python; no se conecta a MongoDB. Su salida muestra notebook (cantidad inferior a 51) y pen (precio igual a 20). La consulta de la shell de MongoDB anterior aplica la misma regla —basta con que coincida una cláusula— a la muestra de db.inventory descrita por separado mediante find().

Usa $and para exigir que coincidan todas las condiciones

$and selecciona un documento solo cuando coinciden todas las cláusulas de su matriz. Para la colección de muestra db.inventory, db.inventory.find({ $and: [{ quantity: { $gte: 20 } }, { price: { $lt: 15 } }] }) exige tanto una cantidad de al menos 20 como un precio inferior a 15. Coincide con notebook y folder: ambos tienen una cantidad de al menos 20 y un precio inferior a 15.

Si las condiciones corresponden a campos distintos, el filtro equivalente con AND implícito es db.inventory.find({ quantity: { $gte: 20 }, price: { $lt: 15 } }). Prefiere esta forma más breve cuando cada campo aparece una sola vez. $and explícito resulta útil cuando la consulta debe combinar varias expresiones sobre un mismo campo, como en db.inventory.find({ $and: [{ price: { $gte: 10 } }, { price: { $lte: 20 } }] }). También permite dejar explícito un grupo de condiciones al crear filtros mediante programación.

No dependas del orden de las cláusulas de $and para evitar que otra cláusula produzca un error. Las expresiones de consulta son condiciones que deben cumplirse; no se garantiza que se evalúen de izquierda a derecha con interrupción anticipada.

Índices y restricciones de los operadores

Los índices pueden influir en el rendimiento de las consultas, pero que uno concreto resulte útil depende de la colección, sus índices y la consulta. Al evaluar el rendimiento de tu propia carga de trabajo, ten en cuenta los campos y predicados del filtro. Este artículo no recomienda un índice ni un plan de consulta específicos.

Al combinar condiciones, ten presente la función de cada operador: $or expresa alternativas, $and exige que coincidan todas las cláusulas y los campos ordinarios de un mismo filtro ya implican AND. Esta distinción ayuda a evitar envoltorios lógicos que no cambian el significado de la consulta.

Elige $in para alternativas de igualdad en un mismo campo

Cuando varias alternativas comprueban la igualdad en un mismo campo, $in suele ser más conciso que repetir ese campo en $or. Por ejemplo, db.inventory.find({ price: { $in: [12, 20] } }) coincide con notebook y pen, cuyos precios son 12 y 20.

Usa $or cuando las alternativas afecten a campos distintos o incluyan predicados que no sean de igualdad, como una comparación de cantidad o una condición sobre el precio. Si deben cumplirse todas las condiciones, usa un filtro normal con varios campos. La elección depende de la lógica que necesites: cualquier cláusula ($or), todas las cláusulas ($and, a menudo implícito) o cualquiera de los valores de igualdad indicados para un campo ($in).