Apakah ada cara untuk menanyakan COUNT dari semua POSTS yang dibuat KEMARIN di FQL? Saya tahu bagaimana melakukan ini dalam SQL tetapi tidak jelas dalam FQL.

4
Matt 13 Desember 2019, 23:41

1 menjawab

Jawaban Terbaik

Ya ada!

FQL sebagai bahasa kueri lebih mirip bahasa pemrograman daripada SQL, karena memiliki banyak fungsi yang melakukan tugas tertentu, dan beroperasi dengan cara yang memungkinkan Anda menggabungkan fungsi dengan cara yang dapat dikomposisi. Jadi, kita dapat mengatasi masalah dengan memecahnya menjadi masalah yang lebih kecil, memecahkan masalah tersebut, dan kemudian menggabungkan solusi menjadi satu kueri.

Masalah pertama yang mudah diatasi adalah KEMARIN. Daripada tanggal tertentu, selalu satu hari sebelum hari ini. Bagaimana kita mendapatkan hari ini? Di fauna-shell (atau melalui Web Shell di Konsol Fauna: https://dashboard.fauna.com), Anda dapat menjalankan kueri ini:

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

Jadi, bagaimana kita mendapatkan KEMARIN?

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

Postingan kami kemungkinan memiliki tanggal posting yang berupa string, jadi mari kita buat string tersebut:

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

Masalah selanjutnya, menemukan posting dengan tanggal posting tertentu. Tidak seperti kebanyakan database SQL, FaunaDB tidak melakukan pemindaian tabel lengkap untuk menemukan catatan, jadi pencarian dan pengurutan memerlukan indeks.

Tapi pertama-tama, jika Anda belum memilikinya, mari buat koleksi "postingan" untuk menyimpan semua dokumen posting kita:

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

Kemudian kita dapat membuat indeks:

> 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 }

Indeks ini bersumber dari koleksi "postingan", menentukan bidang "tanggal belakang" sebagai istilah pencarian, dan untuk catatan yang cocok, mengembalikan nilai bidang "tanggal akhir" dan "ref". "ref" adalah bidang kunci utama untuk semua dokumen di FaunaDB.

Sebelum kita mencari postingan, mari kita buat beberapa:

> 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' } }

Jadi sekarang kami memiliki tiga pos. Mari kita coba mencari satu berdasarkan tanggal. Kami akan menggunakan Paginate untuk mengambil semua entri indeks yang cocok:

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

Dalam kueri itu, kami secara manual menentukan tanggal kemarin. Mari kita ganti tanggal manual dengan tanggal yang dihitung:

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

Alih-alih menunjukkan hasilnya, mari kita hitung:

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

Apa yang terjadi jika kita menambahkan posting lain dengan tanggal kemarin?

> 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

Dan begitulah, hitungan semua posting yang diposting KEMARIN.

10
eskwayrd 13 Desember 2019, 21:13