Probador de consultas MongoDB
Prueba consultas de MongoDB sin base de datos. Pega documentos (o usa los productos y pedidos de ejemplo), escribe un filtro find() o un pipeline de agregación con la sintaxis normal de mongosh y ve al instante los documentos que coinciden, etapa por etapa si quieres.
Última actualización:
Un array JSON es una colección; un objeto de arrays como {"products": [...], "orders": [...]} da varias colecciones para $lookup. Funcionan tanto Extended JSON ($oid, $date) como la sintaxis del shell (ObjectId(), ISODate()).
Cómo usar Probador de consultas MongoDB
- Carga los documentos: usa los productos y pedidos de ejemplo, pega un array JSON (por ejemplo de mongoexport --jsonArray o Compass) o sube un archivo .json.
- Elige find() o aggregate() y selecciona la colección que quieres consultar.
- Escribe la consulta con sintaxis de mongosh, como
{ price: { $lt: 50 } }, o haz clic en un ejemplo. - Lee los resultados en JSON o en tabla. En el modo aggregate, usa Mostrar salida después de para inspeccionar cada etapa.
- Copia el comando mongosh para ejecutar la misma consulta en tu base de datos real.
Chuleta de operadores de consulta de MongoDB
| Operador | Coincide con documentos donde… | Ejemplo |
|---|---|---|
$eq / valor simple | el campo es igual al valor (o lo es un elemento del array) | { status: "shipped" } |
$ne | el campo no es igual, incluidos los documentos sin ese campo | { status: { $ne: "cancelled" } } |
$gt $gte $lt $lte | el valor está en un rango (solo del mismo tipo) | { price: { $gte: 10, $lt: 50 } } |
$in / $nin | el valor (no) es uno de una lista | { category: { $in: ["home", "kitchen"] } } |
$exists | el campo está presente (true) o ausente (false) | { discontinued: { $exists: true } } |
$type | el valor tiene un tipo BSON | { price: { $type: "number" } } |
$regex o /re/ | una cadena coincide con una expresión regular | { name: /^cast/i } |
$and $or $nor | combinaciones de filtros completos | { $or: [ { stock: 0 }, { price: { $gt: 70 } } ] } |
$not | una expresión de operador es falsa | { price: { $not: { $gt: 50 } } } |
$all | un array contiene todos los valores indicados | { tags: { $all: ["wood", "kitchen"] } } |
$elemMatch | un elemento del array cumple todas las condiciones | { ratings: { $elemMatch: { user: "ana", score: 5 } } } |
$size | un array tiene exactamente n elementos | { ratings: { $size: 0 } } |
$expr | una expresión de agregación es verdadera (compara dos campos) | { $expr: { $gt: ["$qty", "$stock"] } } |
Etapas de agregación de un vistazo
| Etapa | Finalidad | Consejo |
|---|---|---|
$match | Filtra documentos con la misma sintaxis que find() | Ponla primero para que las etapas posteriores procesen menos documentos |
$project / $addFields | Reestructura: conserva, elimina, renombra o calcula campos | $addFields conserva todos los campos existentes |
$group | Agrega por una clave con $sum, $avg, $min, $max, $push, $addToSet, $first, $last | _id: null agrupa todos los documentos juntos |
$unwind | Genera un documento por cada elemento del array | Añade preserveNullAndEmptyArrays: true para conservar los arrays vacíos |
$lookup | Unión externa izquierda con otra colección | El resultado es siempre un array; añade después $unwind para una sola coincidencia |
$sort, $skip, $limit | Ordenar y paginar | Ordena también por un campo único para una paginación estable |
$facet | Ejecuta varios subpipelines sobre la misma entrada | Ideal para obtener un recuento y una página de resultados en una sola consulta |
$bucket, $sortByCount, $count | Histogramas, tablas de frecuencia y totales | $sortByCount: "$tags" tras $unwind clasifica las etiquetas |
Reglas que suelen sorprender
- Agrupación por tipos:
{ price: { $gt: "10" } }solo compara cadenas, así que nunca coincide con precios numéricos. Guarda y consulta los números como números. - null coincide con ausentes:
{ discontinued: null }devuelve documentos donde el campo es null o no existe. Usa{ $exists: false }o{ $type: "null" }para distinguirlos. - Proyecciones: no puedes mezclar
1y0en una misma proyección, salvo_id: 0._idse incluye a menos que lo excluyas. - Coincidencia exacta de subdocumento:
{ dims: { w: 12, h: 20 } }exige los mismos campos en el mismo orden; usa notación de punto como{ "dims.w": 12 }para coincidir con un solo campo. - Ordenar arrays: un orden ascendente sobre un campo de array usa su elemento más pequeño, y uno descendente, el más grande.
- Fechas: las consultas de rango sobre fechas necesitan fechas reales (
ISODate()o{"$date": ...}). Las cadenas ISO guardadas como texto solo se comparan como cadenas.
Preguntas frecuentes
¿Necesito un servidor MongoDB para usar esto?
No. El probador incluye su propio motor de consultas escrito en JavaScript que sigue las reglas de coincidencia, proyección, ordenación y agregación de MongoDB, así que se ejecuta en tu navegador sobre los documentos que pegas. No se envía nada a ningún servidor, por lo que también es seguro para datos de ejemplo copiados de producción.
¿Qué sintaxis puedo usar?
Todo lo que escribirías en mongosh: nombres de campo sin comillas, comillas simples o dobles, expresiones regulares como /^abc/i, ObjectId("..."), ISODate("..."), new Date(...), NumberInt(...), comentarios y comas finales. También se aceptan JSON estricto y MongoDB Extended JSON ($oid, $date, $numberLong).
¿Cómo funcionan las coincidencias con arrays?
Como en MongoDB, una condición sobre un campo de array coincide si algún elemento la cumple, así que { tags: "camping" } encuentra los documentos cuyo array tags contiene camping. Usa $all para exigir varios valores, $size para una longitud exacta y $elemMatch cuando un mismo elemento deba cumplir varias condiciones a la vez. La notación de punto, como "ratings.score", accede a arrays de subdocumentos.
¿Cómo uno dos colecciones con $lookup?
Pega un objeto con un array por colección, por ejemplo {"orders": [...], "products": [...]}, elige la colección sobre la que se ejecuta el pipeline y añade una etapa como { $lookup: { from: "products", localField: "productId", foreignField: "_id", as: "product" } }. También se admite la forma con let y pipeline.
¿Los resultados serán idénticos a los de mi servidor MongoDB?
Para los operadores admitidos, los resultados siguen el comportamiento documentado de MongoDB, incluida la agrupación por tipos en las comparaciones, que null coincida con campos ausentes y las claves de ordenación de arrays. Puede haber diferencias con funciones que requieren servidor, como los índices de texto o geoespaciales, la intercalación, $where, las escrituras y el orden de salida de $group, que MongoDB tampoco garantiza. Los números usan dobles de JavaScript, así que no se conserva la precisión de NumberDecimal.
¿Por qué mi filtro no devuelve documentos?
Causas habituales: comparar una cadena con un número ("42" no es igual a 42 y los operadores de rango solo comparan valores del mismo tipo), fechas guardadas como cadenas en lugar de valores ISODate o $date, un error en el nombre del campo o en mayúsculas y minúsculas, o usar un objeto de operador donde se quería un documento anidado. El cuadro de error explica los problemas de sintaxis con la línea y la columna.
¿Puedo usar mis propios datos exportados?
Sí. Pega o sube la salida de mongoexport (tanto --jsonArray como el formato predeterminado de un documento por línea), exportaciones de Compass o cualquier array JSON. Funcionan archivos grandes de varios megabytes, pero el probador está pensado para muestras y no para colecciones completas.
¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?
Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.