Graphql находит пользователя по имени пользователя или электронной почте

Итак, у меня есть эта простая схема:

type User {
        _id: String,
        username: String,
        age: Int,
        email: String,
        password: String,
    }
    type Query {
        user(_id: String!): User,
    }

Резольвер:

import User from './User';

export default {
    Query: {
        user: (_, { _id }) => User.findById(_id),
    },
}

как я могу получить пользователя по некоторым указанным полям, таким как username, email, без создания функции запроса для каждого из них (если бы у пользователя было 1000 уникальных полей, было бы довольно болезненно создавать 1000 запросов для каждого типа)?

Было бы полезно обновить этот вопрос, включив в него более подробную информацию. Что вы используете для уровня хранения? Если вы используете БД, какой ORM или конструктор запросов вы используете для взаимодействия с ней? Что вы уже пробовали? Также может быть полезно увидеть распознаватель для пользовательского запроса.

Daniel Rearden 02.04.2018 20:05

Я использую apollo-server и Mongodb для хранения, обновил вопрос функцией резолвера.

Alex C 02.04.2018 20:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
4
2
5 016
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если имена ваших аргументов совпадают с именами ваших полей, достаточно просто передать весь объект args в качестве параметра в find() или findOne():

Query: {
  user: (_, args) => User.findOne(args),
},

В этом случае вы получите первого пользователя, соответствующего переданным аргументам, и вернете его. Если вы хотите вернуть все возможные совпадения, у вас может быть два отдельных запроса: один возвращает одного пользователя, а другой возвращает список пользователей:

Query: {
  user: (_, args) => User.findOne(args),
  users: (_, args) => User.find(args),
},

Если есть какие-либо аргументы, которые нужно обрабатывать по-другому (например, если вы хотите передать ограничение или добавить какую-либо разбивку на страницы), вы всегда можете использовать вспомогательную библиотеку, такую ​​как lodash или ramda, чтобы вытащить только эти аргументы. Например:

users: (_, args) => {
  const where = omit(args, ['limit'])
  const limit = args.limit || 10
  return User.find(where).sort({'someField': -1}).limit(limit).exec()
}

Вы можете решить свой запрос следующим образом

Query: {
    user: (_, args) => User.findOne({
      where: {
        email: "Your search value"
      }
    }),
  },

  Query: {
    user: (_, args) => User.findOne({
      where: {
        username: "Your search value"
      }
    }),
  },

Другие вопросы по теме