Запрос GraphQL для встроенного / вложенного поля в MongoDB - PullRequest
0 голосов
/ 21 марта 2019

Как указать условие запроса для полей во встроенном / вложенном документе в MongoDB с использованием GraphQL?

В оболочке Монго я легко могу получить документ по

db.users.find({ 'contacts.phone': '8148*****' } ).pretty();

Который принесет мне запись

{
        "_id" : ObjectId("5c93c0601a29f5183929c02c"),
        "name" : "Athul",
        "contacts" : {
                "address" : "Some address",
                "phone" : "8148*****",
                "email" : "***@live.com"
        },
        "__v" : 0
}

На моем GraphQL Схема Я определил запрос, как указано ниже

...
input ContactsInput {
    address: String
    phone: String
    email: String
}

input userInput {
  name: String
  contacts: ContactsInput
}

type RootQuery {
  users(user: userInput): [User!]!
}
....

Resolver для пользователей -

...
const User = require('../../models/user');
...
    users: async args => {
        try{
            const query = JSON.parse(JSON.stringify(args.user));
            const userList = await User.find(query);

            if(!userList) {
                throw new Error("No user found");
            }

            return userList;
        } catch(err){
            throw err;
        }
    }
...

(работает нормально, если я ищу по названию)

А в GraphiQL я пытаюсь получить ту же запись по приведенному ниже запросу

query{
  users(user: {contacts: {
    phone: "8148*****" 
  }}){
    name
    contacts{
      email
      phone
    }
  }
}

, с которой я не могу получить ту же запись.

Потому что на заднем конце его исполняется

db.users.find({ contacts: { phone: '8148405590' } });

, что не эквивалентно

db.users.find({ 'contacts.phone': '8148*****' } );

Не могли бы вы помочь мне решить эту проблему?

1 Ответ

1 голос
/ 22 марта 2019

Похоже, вы должны построить объект запроса перед отправкой на mongodb.

Вы можете попробовать что-то вроде:

const tempQuery = {'contacts.phone': args.user.contacts.phone}

const query = JSON.parse(JSON.stringify(tempQuery));

Вам просто нужно убедиться, что все значения (user.contacts.phone) существуют во входных данных, и если вы хотите иметь другие запросы, вам нужно написать все различные комбинации (например: contacts.email).

В противном случае вы можете заглянуть в этот пост блога о GraphQL-MongoDB и библиотеке graphql-to-mongodb , но для ее реализации вам может понадобиться немного реорганизовать твой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...