Как отфильтровать вложенные массивы объектов в graphql?

#graphql

Вопрос:

Извините за вопрос новичка. Я хотел бы отфильтровать вывод вложенных массивов объектов. Вот мой вопрос:

 properties {
  codes {
    id
  }
}
 

и он возвращается:

 {
  "data": {
    "properties": [
      {
        "codes": [
          {
            "id": "1"
          },
          {
            "id": "2"
          }
        ]
      },
      {
        "codes": [
          {
            "id": "3"
          },
          {
            "id": "4"
          }
        ]
      }
    ]
  }
}
 

Я хочу отфильтровать вывод, где id = «1» в свойствах.коды. Итак, новый запрос заключается в следующем:

 properties {
  codes (id: "1") {
    id
  }
}
 

и на выходе по-прежнему остается пустой массив «коды» :

 {
  "data": {
    "properties": [
      {
        "codes": [
          {
            "id": "1"
          }
        ]
      },
      {
        "codes": []
      }
    ]
  }
}
 

Как бы я правильно отфильтровал вывод? Мне нужно получить это:

 {
  "data": {
    "properties": [
      {
        "codes": [
          {
            "id": "1"
          }
        ]
      }
    ]
  }
}
 

Комментарии:

1. codes (id: "1") фильтрует [существующий] codes контент … похоже, что вам нужно решить ее на более высоком/родительском уровне , например properties( where: { codes: { contains_id: "1"}}}){ codes {... , или просто properties( codesId: "1"){ codes {... , в зависимости от сложности/гибкости фильтрации

Ответ №1:

Вы должны справиться с этим в рамках своей функции решателя. Вы не упомянули свой предпочтительный язык, поэтому я предоставляю простой распознаватель JavaScript/ES6:

 // Dummy data
const data = {
  properties: [
    {
      "codes": [
        { "id": "1" },
        { "id": "2" },
        { "id": "3" }
      ]
    },
    {
      "codes": [
        { "id": "3" },
        { "id": "4" }
      ]
    }
  ]
}

// grab the id param from the arguments
const resolve = ({ id }) => {
  // retrieve the data
  const { properties: props } = data
  const result = []

  // filter data
  const properties = props.reduce((acc, cur) => {
    const codes = cur.codes.filter(code => code.id === id)
    if (codes.length) {
      acc.push({ codes })
    }
    return acc
  }, [])

  return {
    properties
  }
}

console.log(resolve({ id: "1" }))
console.log(resolve({ id: "3" })) 

Комментарии:

1. это то, что я уже делаю в своей функции распознавания (JavaScript). Я просто подумал, что это можно сделать с помощью самого запроса/переменных

2. GraphQL, распознаватели и т. Д. Ничего не делают, кроме как вызывают какие-либо функции распознавателя и передают аргументы (или возвращают значение null, если такового нет). Там нет никакой «магии» для фильтрации или чего-то еще. Это может быть, если вы используете какой-то фреймворк, который может обрабатывать ваше хранилище данных, но это не относится к GraphQL.