Итак, у меня есть эта простая схема:
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 запросов для каждого типа)?
Я использую apollo-server и Mongodb для хранения, обновил вопрос функцией резолвера.


Если имена ваших аргументов совпадают с именами ваших полей, достаточно просто передать весь объект 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"
}
}),
},
Было бы полезно обновить этот вопрос, включив в него более подробную информацию. Что вы используете для уровня хранения? Если вы используете БД, какой ORM или конструктор запросов вы используете для взаимодействия с ней? Что вы уже пробовали? Также может быть полезно увидеть распознаватель для пользовательского запроса.