是否可以为Amplify数据存储构建动态查询



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

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

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时使用直接graphQLapi查询那样查询链接关系,而且我提出的这种方法只在条件之间使用隐式and。

我不知道自从你提出这个问题以来,情况是否发生了变化,但根据文档,看起来多个条件都有一个隐含的and,但你可以用or/and/not:显式地链接它们

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

最新更新