AWS Amplify DataStore 与存在于数组中的过滤器

Posted

技术标签:

【中文标题】AWS Amplify DataStore 与存在于数组中的过滤器【英文标题】:AWS Amplify DataStore with exists-within-array filter 【发布时间】:2021-10-17 22:07:43 【问题描述】:

我们如何使用要求字段位于给定数组中的过滤器进行 DataStore 查询?例如,假设我想获取所有名字在数组 ["Sally", "Bob", "James"] 中的用户?

这是我可以创建的最接近的 graphQL 查询。它使用“eq”(等于)过滤器操作。我在问是否有另一个过滤操作来检查给定数组中是否存在该值?

类似这样,但不是“eq”,而是“存在于这个数组中”的语法。

query MyQuery 
  listUsers(filter: firstName: eq: "Sally") 
    items 
      firstName
      lastName
      email
    
  

请提供我正在描述的 graphQL 查询以及 DataStore 语法中的相同查询。对于 DataStore js api。 类似于...的东西。

const users = await DataStore.query(User, (u) =>
  u.firstName('exists-within-array', ["Sally", "Bob", "James"]),
)

【问题讨论】:

【参考方案1】:

可以在这里找到一个好的起点:

How to Filter List/Queries With AND/OR operators AWS Amplify javascript GraphQL

这个想法是将你的数组转换成一个可以作为过滤器对象传递的对象。

let filter = 
        or: [
            
                id: eq:1
            ,
            
                id: eq:2
            ]
    

尝试类似:

    const searchArray =  ["Sally", "Bob", "James"]
    let fieldName = "firstname";
    
    let filterMembers = searchArray.map((item)=> JSON.parse(`"$fieldName":"eq":"$item"`));
    let filter = or:filterMembers;

并将过滤器对象作为参数传递给查询。

【讨论】:

好的,这样就可以使用 graphql 语法了。为了适应 DataStore.query(),我正在考虑做这样的事情... const searchArray = ["Sally", "Bob", "James"] let fieldName = "firstName"; async getUsers(searchArray) const filter = 'u.or(u => u' searchArray.forEach((user) => filter.append(.firstName('eq', '$user.firstName')) ) const users = await DataStore.query(User, eval (filter)) ,但是,我已经读过使用 eval() 函数在安全方面是不好的做法。快到了!

以上是关于AWS Amplify DataStore 与存在于数组中的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

我可以在使用 AWS amplify for Cognito 和 DataStore 的同时使用 fire base 来托管我的 Flutter Web 应用程序吗

如何在 Amplify Datastore 中创建动态查询

如何将 AWS Amplify 控制台中的现有应用程序与 AWS Amplify CLI 连接?

如何将 Quasar 2 与 AWS Amplify 结合使用?

NextJS 与 Aws Amplify 部署错误

Flutter 与 AWS 的集成(有和没有 Amplify)