有没有办法查询FQL中在YESTERDAY创建的所有POST的计数?

时间:2019-12-13 20:41:40

标签: faunadb

是否可以查询FQL中在YESTERDAY创建的所有POST的计数?我知道如何在SQL中执行此操作,但在FQL中尚不清楚。

1 个答案:

答案 0 :(得分: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

我们已经掌握了昨天发布的所有帖子。