【问题标题】:How to do filteration in AWS Amplify GraphQL Client如何在 AWS Amplify GraphQL 客户端中进行过滤
【发布时间】:2019-05-25 15:04:59
【问题描述】:

我正在尝试使用 Amplify GraphQL 客户端实现 GraphQL 过滤器。我得到了一份待办事项列表,并想检索状态已完成的待办事项列表。

文档仅显示如何获取所有项目和单个项目

const allTodos = await API.graphql(graphqlOperation(queries.listTodos));
console.log(allTodos);

有人可以告诉我如何将过滤器应用到 listTodos 以便它只返回状态为完成的待办事项。

我尝试执行以下操作,但它是错误的。

API.graphql(graphqlOperation(queries.listTodos(filter: {
    status: {
        eq: "completed"
    }
})));

【问题讨论】:

  • 您的架构和请求映射模板是什么样的? listTodos 查询是否接受过滤器输入或其他内容?我知道,如果您选择从示例架构开始,AppSync 会为您生成这些过滤器输入
  • 是的,代码是由放大代码生成器自动生成的。所以它需要过滤器、限制和下一个令牌
  • 请记住,过滤器是在前端应用的(至少目前是这样)。您必须设置更高的待办事项限制才能正确过滤它们

标签: reactjs react-native graphql aws-appsync aws-amplify


【解决方案1】:

我想我已经回答了你的问题,但我也有关于 AWS Amplify codegen 查询、突变等的类似问题。如果你查看在 ~/graphql 文件夹内生成的代码,你'会找到一个类似这样的声明文件:

export const listOrganizations = `query ListOrganizations(
  $filter: ModelOrganizationFilterInput
  $limit: Int
  $nextToken: String
) {
  listOrganizations(filter: $filter, limit: $limit, nextToken: $nextToken) {
    items {
      id
      name
      address
    }
    nextToken
  }
}
`;

您可以在此处看到ListOrganizations 查询的第一个参数(在您的情况下为ListTodos 查询)采用filter: $filter 的第一个参数。到目前为止,我发现您可以通过执行以下操作来修改此查询...

API.graphql(graphqlOperation(queries.listTodos, {
    filter: {
        status: {
            eq: "completed"
        }
    }
})));

这应该过滤掉所有的待办事项,除了那些status 等于completed 的待办事项。我遇到的问题是我想启用不同级别的访问控制,这样任何拥有Admin Cognito 用户池组的人都可以查看@model 以及@owner。我能够使用@auth 转换器让这一切正常工作,但现在我的问题是,在某些屏幕上,我只想显示某些实体,即该实体的owner,因为我也是@987654336 @,API 默认为我提供一切。我想用这个@filterModelOrganizationFilterInput 只给我作为所有者的数据。我发现这样做的唯一方法是将owner 字段添加到我的架构中,但是API 总是提供所有者字段,我想过滤掉该字段。

我能找到的关于 aws-amplify APIgraphqlOperation 方法的唯一文档在这里:https://aws-amplify.github.io/docs/js/api 但没有太多示例,并且它们没有显示 API 如何在客户。我被卡住了。

【讨论】:

  • 嗨@SuperVeetz,你解决了你的问题吗?至于您建议的过滤器,它适用于字符串类型的字段,但对于 JSON 对象类型的字段怎么样。
  • 嗨@MohammadHarith,老实说,我不完全确定,我认为如果您的对象时间是嵌套的,那么您可以执行类似filter: { myObj { someProp { eq: "somevalue" } } } 的操作,这可能有效,可能不会。我遇到了一个更大的问题,即如何实施基于组的安全性,现在,如何按基于组的安全性进行过滤......即。 @auth 转换声明动态或静态安全组,我可以按组名过滤结果,还是按给定用户名是否包含在用户组中过滤结果。
  • 是的,它不起作用,该字段具有 AWSJSON 类型并且它作为一个长字符串返回,所以我只是添加了一个新字段来指定对象中的项目并使用前面建议的过滤效果很好就我而言。谢谢!!
  • 嗨@SuperVeetz,我又卡住了,这次我需要过滤状态为已完成和待处理的待办事项。我怎样才能做到这一点?我试过status: { eq: ["completed","pending"] },但没有用。
  • 嗨 Mohammed,老实说,我自己还没有遇到过这个问题,但我相信你可以使用 AND { eq: "completed" .. } , { eq: "pending" } .. 我相信有语法可以做到这一点,但我还不是 100% 确定它是什么.. 检查 graphql 放大文档
猜你喜欢
  • 2020-03-27
  • 2020-11-02
  • 2019-06-02
  • 2021-08-31
  • 2019-01-15
  • 2022-07-30
  • 2018-10-27
  • 1970-01-01
  • 2022-06-28
相关资源
最近更新 更多