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 应用程序吗
如何将 AWS Amplify 控制台中的现有应用程序与 AWS Amplify CLI 连接?