Tengo algunos grupos creados por usuarios en mi base de datos. Cada grupo tiene varios miembros. Así es como se ve un grupo típico:

{
    "groupName": "some-group-name",
    "userIds": ["001", "002", "003"]
}

También tengo un nodo separado de usuarios en mi base de datos. Así es como se ve un usuario:

{
    "id": "001",
    "userName": "some-unique-username"
}

Quiero enumerar todos los grupos y sus miembros. Entonces, sería:

  • grupo 1

    • ID de usuario1; nombre de usuario1;
    • ID de usuario2; nombre de usuario2;
  • Grupo 2

    • ID de usuario3; nombre de usuario3;
    • ID de usuario4; nombre de usuario4;

Y así sucesivamente...

¿Cómo sería posible (en todo caso) obtener estos grupos y sus ID de usuario y también consultar usuarios por ID y devolver un solo JSON que contenga todos los datos solo con una solicitud?

En este momento solo estoy obteniendo una cierta cantidad de grupos, iterando sobre el userIds de cada uno de ellos y enviando una solicitud para cada usuario por separado. No estoy preguntando sobre paginación o consultas simples, solo quiero que todos los grupos y los usuarios estén dentro de esos grupos.

0
Nikaoto 17 feb. 2018 a las 01:35

2 respuestas

La mejor respuesta

Lo descubrí yo mismo.

Lo que tenía que hacer era crear un solucionador separado para buscar miembros de cada grupo:

resolvers: {
    ...
    Group: {
        members: (group, _, context) => group.members.map(memberId => context.db.findUserById(memberId)
    }
    ...
}

El objeto del grupo principal se pasa como el primer argumento al solucionador, así que cuando consulto:

{
    groups(count: 10){
        name
        members {
            name
        }
    }
}

Devuelve los nombres de los primeros 10 grupos junto con los nombres de sus miembros.

5
deviousdodo 24 mar. 2018 a las 19:44

Con el siguiente esquema,

type User {
   name: String
   firstName: String
   location: String
}

type Group {
   groupname:String!
   users:[User!]
}

type Query {
   groups:[Group!]
   group(name: String): Group
}

La siguiente consulta:

{
groups
 {
  groupname
  users {
       name
       firstName
       location
  }
 }
}

Podría volver

{
  { name: "group1",
    users: [{name:"user1", firstName:"firstName1", location:"Localtion1"},
    {name:"user2", firstName:"firstName2", location:"Localtion2"}]
  },
  { name: "group2",
    users: [{name:"user1", firstName:"firstName1", location:"Localtion1"}]
  },
  ...etc..
}

Espero que esto ayude,

1
Olivier Refalo 17 feb. 2018 a las 16:00