0

I have following MongoDB schema.

Item {
  _id: ObjectId,
  translations: [{
    language: String
    name: String
  }]
}

So my Item instance could look something like this.

{
  _id: ObjectId("5ba3bf09d3121aba3ba2f488"),
  translations: [
  {
    language: "en"
    name: "a Car"
  },
  {
    language: "de",
    name: "der Wagen"
  }]
}

And I want to be able to query my data with specific language with Graphql this way.

{
  item(where: {language: "en"}) {
    name
  }
}

So it would produce nice output with shape like this.

{
  name: "a Car"
}

Please can you tell me some good practice or nice way I can setup my Graphql resolvers map?

I'm using Apollo Server.

Thank you very much!

pneme
  • 23
  • 5

1 Answers1

6

A general solution for a language specific query (with more than one field) could be:

  • passing the language parameter to the query resolver
  • store the language on the resolver context
  • use the language from the context wherever needed

Query:

query {
  item(language: "en") {
    name
    otherField
  }
}

Resolver:

{
  item: (_, { language }, context) => {
    context.language = language;
    return {
      name: (_, context) => getNameByLang(context.language),
      otherField: (_, context) => getOtherByLang(context.language),
    };
  },
}

Or if there's only one translated field:

query {
  item {
    name(language: "en")
  }
}

so you get the language directly in the name resolver as an argument.

{
  item: () => ({
    name: ({ language }) => getNameByLang(language),
  })
}
Christof Aenderl
  • 4,233
  • 3
  • 37
  • 48