【问题标题】:Is there a way to query the COUNT of all the POSTS created YESTERDAY in FQL?有没有办法在 FQL 中查询 YESTERDAY 创建的所有 POSTS 的 COUNT?
【发布时间】:2020-04-07 07:37:57
【问题描述】:

有没有办法在 FQL 中查询 YESTERDAY 创建的所有 POSTS 的 COUNT?我知道如何在 SQL 中执行此操作,但在 FQL 中不清楚。

【问题讨论】:

    标签: faunadb


    【解决方案1】:

    是的,有!

    FQL 作为一种查询语言,与其说是 SQL,不如说是一种编程语言,因为它具有许多执行特定任务的函数,并且它的运行方式允许您以可组合的方式组合函数。因此,我们可以通过将问题分解为更小的问题、解决这些问题,然后将解决方案组合到单个查询中来解决问题。

    第一个容易解决的问题是 YESTERDAY。它总是比当前日期早一天,而不是特定日期。我们如何获得当前日期?在fauna-shell(或通过 Fauna 控制台中的 Web Shell:https://dashboard.fauna.com),您可以运行此查询:

    > ToDate(Now())
    Date("2019-12-13”)
    

    那么,我们如何得到 YESTERDAY?

    > TimeSubtract(ToDate(Now()), 1, "day")
    Date("2019-12-12")
    

    我们的帖子可能有一个字符串的发布日期,所以让我们把它变成一个字符串:

    > ToString(TimeSubtract(ToDate(Now()), 1, "day"))
    '2019-12-12'
    

    下一个问题,查找具有特定发布日期的帖子。与大多数 SQL 数据库不同,FaunaDB 不执行全表扫描来定位记录,因此搜索和排序需要索引。

    但首先,如果您还没有,让我们创建一个“帖子”集合来存储我们所有的帖子文档:

    > CreateCollection({ name: "posts" })
    { ref: Collection("posts"),
      ts: 1576256260580000,
      history_days: 30,
      name: 'posts' }
    

    然后我们就可以创建索引了:

    > CreateIndex({
      name: "posts_by_date",
      source: Collection("posts"),
      terms: [{ field: ["data", "postdate"]}],
      values: [{field: ["data", "postdate"]}, {field: ["ref"]}]
    })
    { ref: Index("posts_by_date"),
      ts: 1576256995310000,
      active: false,
      serialized: true,
      name: 'posts_by_date',
      source: Collection("posts"),
      terms: [ { field: [ 'data', 'postdate' ] } ],
      values: [ { field: [ 'data', 'postdate' ] }, { field: [ 'ref' ] } ],
      partitions: 1 }
    

    该索引来源于“posts”集合,将“postdate”字段指定为搜索词,对于匹配记录,返回“postdate”和“ref”字段值。 “ref”是 FaunaDB 中所有文档的主键字段。

    在我们搜索帖子之前,让我们创建一些:

    > Create(Collection("posts"), { data: { title: "Last week", postdate: "2019-12-06" }})
    { ref: Ref(Collection("posts"), "251656374064251392"),
      ts: 1576257070530000,
      data: { title: 'Last week', postdate: '2019-12-06' } }
    > Create(Collection("posts"), { data: { title: "Yesterday", postdate: "2019-12-12" }})
    { ref: Ref(Collection("posts"), "251656397874266624"),
      ts: 1576257093220000,
      data: { title: 'Yesterday', postdate: '2019-12-12' } }
    > Create(Collection("posts"), { data: { title: "Today", postdate: "2019-12-13" }})
    { ref: Ref(Collection("posts"), "251656411087372800"),
      ts: 1576257105810000,
      data: { title: 'Today', postdate: '2019-12-13' } }
    

    所以现在我们有三个帖子。让我们尝试按日期搜索。我们将使用Paginate 检索所有匹配的索引条目:

    > Paginate(Match(Index("posts_by_date"), "2019-12-12"))
    { data:
       [ [ '2019-12-12', Ref(Collection("posts"), "251656397874266624") ] ] }
    

    在该查询中,我们手动指定了昨天的日期。让我们将手动日期替换为计算日期:

    > Paginate(Match(Index("posts_by_date"), ToString(TimeSubtract(ToDate(Now()), 1, "day"))))
    { data:
       [ [ '2019-12-12', Ref(Collection("posts"), "251656397874266624") ] ] }
    

    我们不显示结果,而是数一数:

    > Count(Match(Index("posts_by_date"), ToString(TimeSubtract(ToDate(Now()), 1, "day"))))
    1
    

    如果我们添加另一个具有昨天日期的帖子会怎样?

    > Create(Collection("posts"), { data: { title: "Another Yesterday", postdate: "2019-12-12" }})
    { ref: Ref(Collection("posts"), "251657749479293440"),
      ts: 1576258382210000,
      data: { title: 'Another Yesterday', postdate: '2019-12-12' } }
    > Count(Match(Index("posts_by_date"), ToString(TimeSubtract(ToDate(Now()), 1, "day"))))
    2
    

    我们有它,昨天发布的所有帖子的计数。

    【讨论】:

    • 很好的答案。 +100
    猜你喜欢
    • 2023-01-20
    • 2021-11-28
    • 1970-01-01
    • 2020-07-05
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多