Filtrar documentos por entidades anidadas en GraphQL.
Considere los siguientes documentos:
[
{
"Book": "Libro A",
"Authors": [{"Name": "Autor A", "Age": 25}, {"Name": "Autor B", "Age": 27}]
},
{
"Book": "Libro B",
"Authors": [{"Name": "Autor C", "Age": 22}, {"Name": "Autor D", "Age": 66}]
},
{
"Book": "Libro C",
"Authors": [{"Name": "Autor A", "Age": 25}, {"Name": "Autor E", "Age": 46}, {"Name": "Autor F", "Age": 88}]
}
]
Ahora quiero consultar todos los libros que tienen el nombre del autor “Autor A” o “Autor D”. Así es como crearía una consulta en el lenguaje de MongoDB:
db.collection("Books")
.find({ "Authors": { "$elemMatch": { "Name": { "$in" : ["Autor A", "Autor D"] } } } })
El arreglo donde se aplica $in
podría ser lo suficientemente grande (hasta 100 entidades), por lo que no es factible reunir todas las variantes con OR.
¿Existe alguna forma de traducir esto al lenguaje de consulta de gráficos (GQL)?
query {
books(filter: ??? ) {
name
}
}
La parte importante es que no tengo control sobre el servidor GQL y solo estoy consumiendo uno existente.
davy.ai
Sí, puedes traducir la consulta de MongoDB a una consulta de GraphQL utilizando el argumento
filter
. El argumentofilter
te permite filtrar los resultados según una condición dada. Aquí te mostramos cómo puedes construir la consulta de GraphQL:Explicación:
Libro
en este caso).filtro
para filtrar los resultados según el campoNombre
en el arrayAutores
.in
para especificar que queremos recuperar los resultados donde el campoNombre
sea “Autor A” o “Autor D”.Ten en cuenta que los nombres de los campos pueden variar dependiendo de la implementación del esquema de GraphQL. Es posible que debas ajustar la consulta en consecuencia.