Ste*_*ano 3 elasticsearch amplifyjs graphql aws-appsync aws-amplify
我正在尝试查询特定日期范围内所有项目的项(其中具有AWS DateTime的CreatedAt和UpdatedAt字段)。例如,过去48小时。
例如,使用以下架构:
type Note @model @searchable @auth(rules: [{ allow: owner }]) {
id: ID!
note: String
createdAt: AWSDateTime
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方式搜索日期:
query {
searchNotes(filter:{createdAt: { matchPhrasePrefix: "2018-12-27"}}) {
items{
id
title
createdAt
}
}
}
Run Code Online (Sandbox Code Playgroud)
它返回所有带有该字符串前缀的与UTC时间匹配的音符。
从那里,我必须使用moment.diff()或其他方法对自己进行排序。
我不确定是否有使用AppSync和GraphQl按日期和时间进行搜索/筛选的更好/更有效的方法?
谢谢。
agu*_*ars 10
您可以使用此查询来过滤 2 AWSDateTime:
query {
searchNotes(filter:{createdAt: { between: ["2018-12-27T00:00:00", "2019-01-27T00:00:00"]}}) {
items{
id
title
createdAt
}
}
}
Run Code Online (Sandbox Code Playgroud)
截至撰写时(2019年1月3日),最简单的方法是将日期存储为整数(例如,自纪元以来的秒数),这将打开gt, lt, gte, ...自动生成的搜索解析器过滤器输入上的过滤器字段。
另一个解决方案是使用AWS AppSync控制台或您自己的CloudFormation堆栈编写自己的解析器。编写自己的解析器时,您可以利用整个Elasticsearch DSL来实现各种查询(请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html) 。要沿这条路线走,您可以在架构中的“查询”类型中添加自己的搜索字段,并编写自定义解析器。
type Query {
searchNotesByCreatedAt(start: String!, end: String!): NotesConnection
}
Run Code Online (Sandbox Code Playgroud)
然后通过控制台或您自己的CloudFormation堆栈,您可以编写如下的解析器:
{
"version": "2017-02-28",
"operation": "GET",
"path": "/note-<your-api-id>/doc/_search", // created by amplify
"params": {
"body": {
"sort": [{ "createdAt" : {"order" : "desc"}}],
"query": {
"range" : {
"createdAt" : {
"gte": $ctx.args.start,
"lte": $ctx.args.end
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您只需要使用控制台或您自己的CF堆栈临时部署此解析器。正在做一些工作,以允许您从放大CLI中编写自己的解析器。有关如何工作的更多信息,请参见https://github.com/aws-amplify/amplify-cli/issues/574。
让我知道这是否适合您。
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |