如何在FaunaDB GraphQL中实现时间的大于/小于条件查询?
在FaunaDB GraphQL中实现基于时间的大于/小于条件查询
嘿,我来帮你搞定FaunaDB GraphQL里的时间范围查询问题~ 首先得明确:FaunaDB自动生成的精确匹配查询(比如你现有的todosByCreatedAtFlag)没法直接做范围过滤,我们需要借助索引或者**自定义函数(UDF)**来实现,下面分两种常用方法详细说:
方法一:用索引快速实现单方向范围查询(大于/小于)
这是最简便的方式,FaunaDB支持基于索引自动生成带比较运算符的查询参数:
步骤1:创建基于时间字段的索引
首先在Fauna控制台用FQL创建一个以created_at为排序字段的索引:
CreateIndex({ name: "todos_by_created_at", source: Collection("Todo"), values: [ { field: ["data", "created_at"] } ], permissions: { read: "public" // 按需设置权限 } })
步骤2:直接使用自动生成的范围参数查询
创建完索引后,你可以直接在GraphQL查询里用_gt(大于)、_lt(小于)、_gte(大于等于)、_lte(小于等于)这些后缀参数,比如查询创建时间晚于指定时间的Todo:
query { allTodos(created_at_gt: "2017-02-08T16:10:33Z") { data { _id name created_at } } }
如果你想给这个范围查询起个更直观的名字(比如todosCreatedAfter),可以修改你的GraphQL Schema,通过@index指令绑定到刚才创建的索引:
type Todo { name: String! created_at: Time } type Query { allTodos: [Todo!]! todosByCreatedAtFlag(created_at: Time!): [Todo!]! # 自定义大于查询名称 todosCreatedAfter(created_at_gt: Time!): [Todo!]! @index(name: "todos_by_created_at") # 自定义小于查询名称 todosCreatedBefore(created_at_lt: Time!): [Todo!]! @index(name: "todos_by_created_at") }
之后就可以用自定义名称查询了:
query { todosCreatedAfter(created_at_gt: "2017-02-08T16:10:33Z") { data { _id name created_at } } }
方法二:用自定义函数(UDF)实现复杂范围查询
如果需要更复杂的逻辑(比如同时查询时间区间内的Todo),可以用Fauna的UDF来实现:
步骤1:创建处理时间区间的UDF
用FQL创建一个函数,接收起始和结束时间,返回该区间内的Todo:
CreateFunction({ name: "get_todos_between_dates", body: Query( Lambda( ["start_date", "end_date"], Paginate( Match( Index("todos_by_created_at"), // 复用之前创建的索引 Range(Time(Vars("start_date")), Time(Vars("end_date"))) ) ) ) ), permissions: { call: "public" // 按需设置权限 } })
步骤2:在GraphQL Schema中映射UDF
修改你的Schema,添加对应的查询字段并绑定到UDF:
type Query { # 其他查询... todosBetweenDates(start_date: Time!, end_date: Time!): [Todo!]! @function(name: "get_todos_between_dates") }
步骤3:执行区间查询
现在就可以查询指定时间范围内的Todo了:
query { todosBetweenDates(start_date: "2017-02-08T16:10:33Z", end_date: "2017-02-09T16:10:33Z") { data { _id name created_at } } }
内容的提问来源于stack exchange,提问作者noi.m
相关产品推荐
相关产品推荐

