Solución:
El lenguaje FQL de FaunaDB es bastante similar a JavaScript (lo que ayuda mucho si desea realizar transacciones condicionales, etc.).
En esencia, FaunaDB también tiene un mapa. Dado que su índice contiene solo una valor esa es la referencia puedes escribir esto:
q.Map(
q.Paginate(q.Match(q.Index('skus'))),
q.Lambda(x => q.Get(x))
)
Para este caso específico, en realidad no necesita un índice, ya que cada colección tiene un índice predeterminado incorporado para seleccionar todo a través de la función ‘Documentos’.
q.Map(
q.Paginate(Documents(Collection('<your collection>'))),
q.Lambda(x => q.Get(x))
)
Ahora, en caso de que el índice que está utilizando devuelva varios valores (porque querría ordenar en algo que no sea ‘ref’), entonces debe proporcionar la misma cantidad de parámetros al Lambda que la cantidad de valores que se definieron en el índice. Digamos que mi índice tiene ts y árbitro en valores porque quiero ordenarlos a tiempo, entonces la consulta para obtener todos los valores se convierte en:
q.Map(
q.Paginate(q.Match(q.Index('<your index with ts and ref values>'))),
q.Lambda((ts, ref) => q.Get(ref))
)
Los valores se utilizan para consultas / clasificación de rango, pero también definen lo que devuelve el índice
Volviendo a sus preguntas:
– ¿Puedo consultar todos los documentos en una sola llamada?
Absolutamente, le aconsejaría que lo hiciera. Tenga en cuenta que los documentos que obtendrá se paginan automáticamente. Puede establecer el tamaño de la página proporcionando un parámetro para paginar y obtendrá un atributo ‘después’ o ‘antes’ en caso de que la página sea más grande. Que después o antes se puede volver a presentar a la función Paginate como parámetro para obtener una página anterior o siguiente: https://docs.fauna.com/fauna/current/api/fql/functions/paginate
– ¿Puedo realizar una consulta de este tipo sin un índice?
No, pero puede utilizar el índice integrado como se explicó anteriormente. FaunaDB protege a los usuarios de realizar consultas sin un índice. Dado que es una base de datos escalable que podría contener datos masivos y es de pago por uso, es una buena idea evitar que los usuarios se disparen en el pie :). La paginación y los índices obligatorios ayudan a hacer eso.
En cuanto al por qué FQL es diferente. FQL es un lenguaje que no es declarativo como muchos lenguajes de consulta. En cambio, es procedimental, escribe exactamente cómo recuperas datos. Eso tiene ventajas:
- Al escribir cómo se recuperan los datos, puede predecir exactamente cómo se comporta una consulta, lo cual es bueno tener en un sistema de pago por uso.
- El mismo lenguaje se puede usar para reglas de seguridad o transacciones condicionales complejas (actualizar ciertas entidades o muchas entidades que se extienden sobre diferentes colecciones dependiendo de ciertas condiciones). Es bastante común en Fauna escribir una consulta que hace muchas cosas en una transacción.
- Nuestra variedad de ‘procedimientos almacenados’ llamados funciones definidas por el usuario están simplemente escritos en FQL y no en otro lenguaje.
Las consultas también se analizan en este tutorial que viene con código en un repositorio de GitHub que podría brindarle una imagen más completa: https://css-tricks.com/rethinking-twitter-as-a-serverless-app/
¿Puedo consultar todos los documentos en una sola llamada?
Sí, si tu colección es pequeña. los Paginate
la función tiene como valor predeterminado la obtención de 64 documentos por página. Puede ajustar el tamaño de la página hasta 100.000 documentos. Si su colección tiene más de 100,000 documentos, entonces debe ejecutar múltiples consultas, usando cursores para buscar documentos posteriores.
Consulte el tutorial de paginación para obtener más detalles: https://docs.fauna.com/fauna/current/tutorials/indexes/pagination
¿Si no, porque no? ¿Cuál es la lógica detrás de tal diseño?
Para una base de datos SQL, SELECT * FROM table
es conveniente y, potencialmente, una pesadilla de recursos. Si la tabla contiene miles de millones de filas, intentar entregar resultados para esa consulta podría consumir los recursos disponibles en el servidor y / o el cliente.
FaunaDB es un recurso de base de datos compartido. Queremos que las consultas funcionen bien para cualquier usuario con cualquier base de datos, y eso requiere que establezcamos límites razonables en la cantidad de documentos involucrados en una sola transacción.
¿Puedo realizar una consulta de este tipo sin un índice?
No y sí.
La recuperación de varios resultados de FaunaDB requiere un índice, a menos que esté rastreando de forma independiente las referencias de los documentos. Sin embargo, con el recientemente agregado Documents
(actualmente en versión preliminar, por lo que no se recomienda para cargas de trabajo de producción), ahora mantenemos un índice interno para que ya no necesite crear su propio índice para acceder a todos los documentos de una colección.
Consulte la página de referencia de Documentos para obtener más detalles: https://docs.fauna.com/fauna/current/api/fql/functions/documents
Volviendo a su código de ejemplo, está ejecutando dos consultas, pero podrían combinarse fácilmente en una. FQL es altamente componible. Por ejemplo:
let allDocuments = await client.query(
q.Map(
q.Paginate(q.Documents(q.Collection("skus"))),
q.Lambda("X", q.Get(q.Var("X")))
)
)
Su observación de que FQL es prolija, es correcta. Muchos lenguajes funcionales exhiben esa palabrería. La ventaja es que cualquier función que acepte expresiones se puede componer a voluntad. Uno de los mejores ejemplos de componibilidad y cómo gestionar las referencias entre documentos se presenta en nuestro tutorial de comercio electrónico, específicamente, la sección que describe el submit_order
función: https://docs.fauna.com/fauna/current/tutorials/ecommerce#function