You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:42:40