【问题标题】:AWS Amplify DataStore with exists-within-array filterAWS Amplify DataStore 与存在于数组中的过滤器
【发布时间】: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"]),
)

【问题讨论】:

    标签: filter aws-amplify datastore


    【解决方案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() 函数在安全方面是不好的做法。快到了!
    猜你喜欢
    • 2022-12-14
    • 2019-12-26
    • 2020-08-17
    • 1970-01-01
    • 2020-10-26
    • 2022-12-06
    • 2021-08-31
    • 2019-06-02
    • 2023-03-20
    相关资源
    最近更新 更多