首页 > 解决方案 > 过滤 GraphQL 查询的正确方法是什么?

问题描述

例如,假设我按如下方式调用 graphQL:

query {
          product {
            title
            description
            price
            path
          }
        }

这个调用返回给我一个包含 10 个项目的数组,但我随机只想要 5 个。我目前将其设置为获取 10 个然后随机抓取 5 个,但我觉得 GraphQL 仍然工作太努力,如果我说返回 1000 个项目,我不需要其中的 995 个。

我见过这样的查询:

        query {
          product(limit:5) {
            title
            description
            price
            path
          }
        }

这将使它无论如何只返回 5 件物品。我的问题是,这是在解析器中处理的吗?

我的解析器当前的外观是:

product: async () => {
    try {
    const products = await Product.find()

      return products.map(product => {
        return transformProduct(product);
      })
    } catch (err) {
      throw err;
    }
  }

这样做是否正确:

product: async ({limit}) => {
    try {
    let products = await Product.find()
      if(limit) {
        products = getRandom(products, limit)
      }

      return products.map(product => {
        return transformProduct(product);
      })
    } catch (err) {
      throw err;
    }
  }

我现在已经测试过它是否有效,但我担心 GraphQL 仍然检索到比它需要的更多的数据。这是阿波罗处理其“第一”和“跳过”变量的方式还是更有效?

标签: reactjsgraphql

解决方案


您基本上需要将“限制”传递给您的 Product.find() 以便它只处理从数据库中检索 5;也许在 SQL 中使用“LIMIT 5”子句,假设您也将 SELECT 更改为随机化。如果你在丢弃大部分之前检索它们,那么你实现的 GraphQL 过滤器很糟糕


推荐阅读