gpt4 book ai didi

amazon-web-services - 是否可以为 Amplify Datastore 构建动态查询?

转载 作者:行者123 更新时间:2023-12-05 06:11:40 25 4
gpt4 key购买 nike

我希望为我的 Amplify Datastore 创建一个查询构建器。该函数应处理一组条件,这些条件需要应用于查询并返回相应的谓词。如果只有一个过滤器,这很容易完成,但我希望能够处理任意数量的过滤器。

我的目标是能够像这样编写查询:

Datastore.query(Post, *queryBuilder(filters)*)

我可以在其中传递一组过滤器,过滤器看起来像这样:

filter = {
connector: 'or' |
property: rating
predicate: 'gt'
value: 4
}

查询构建器以下面提到的格式返回谓词。我曾尝试在查询构建器中链接并返回多个函数,但我无法找出一种模式来创建正确的谓词函数。


作为引用,这是根据文档构建查询的方式:https://docs.amplify.aws/lib/datastore/data-access/q/platform/js#predicates

const posts = await DataStore.query(Post, c => c.rating("gt", 4));

对于多个条件:

const posts = await DataStore.query(Post, c =>
c.rating("gt", 4).status("eq", PostStatus.PUBLISHED)
);

最佳答案

假设我们有模型:

type Post @model{
id: ID!
category: String
city: String
content: String
}

我们希望通过动态数量的变量按城市和类别查询和过滤。然后我们可以在我们的脚本中创建一个这样的函数:

const fetchData = async props => {
/*
More configurable wrapper for Datastore.query calls
@param props: {model: Model, criteria: [{fieldId, predicate, value}]}.
*/
try {
let criteria;
if (props.criteria && typeof props.criteria === 'object') {
criteria = c => {
props.criteria.forEach(item => {
const predicate = item.predicate || 'eq';
c[item.fieldId](predicate, item.value);
});
return c;
};
} else {
criteria = props.criteria;
}
return await DataStore.query(props.model, criteria);
} catch (e) {
throw new Error(e);
}
}

所以现在如果我们想执行这个,我们可以传递参数:

// where Post = models.Post
const myResult = fetchData({model: Post, criteria: [
{ fieldId: 'category',
predicate: 'eq',
value: 'news'
},
{
fieldId: 'city',
predicate: 'eq',
value: 'SomeCityName'
}]
})

不幸的是,我不知道还有一种方法可以查询链接关系,就像您在使用 DataStore 时使用直接 graphQL api 查询一样,而我介绍的这种方法仅使用条件之间的隐式 AND。

关于amazon-web-services - 是否可以为 Amplify Datastore 构建动态查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63897193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com