


Adakah saya memerlukan perjalanan pergi balik tambahan ke firestore untuk membaca medan cap masa yang dibuat dan dikemas kini?
Apabila menggunakan Firestore, anda mungkin tertanya-tanya sama ada perjalanan pergi balik tambahan diperlukan untuk membaca medan cap masa yang dibuat dan dikemas kini. Jawapannya tidak. Firestore secara automatik menyediakan cap masa penciptaan dan kemas kini untuk setiap dokumen, dan anda boleh mendapatkan maklumat masa yang sepadan dengan merujuk medan ini. Dengan cara ini, anda tidak memerlukan operasi tambahan untuk membaca medan cap masa dan anda boleh mendapatkan masa penciptaan dan kemas kini dokumen dengan lebih mudah. Reka bentuk ini menjadikan proses pembangunan lebih cekap dan dipermudahkan, mengelakkan kod dan permintaan yang tidak perlu.
Isi soalan
-
Baiklah, ini saya
go
中有一个rest api
,它使用firestore
存储ticket
Sumber. Untuk ini saya gunakan: firestore go client -
Saya mahu boleh mengisih dokumen saya dengan
date 创建/更新日期
jadi mengikut dokumen saya menyimpan 2 medan ini sebagai cap masa dalam dokumen. -
Saya menggunakan label
servertimestamp
pada kedua-dua medan. Dengan melakukan ini, nilai itu mestilah masa yang diambil untuk pelayan firestore memproses permintaan. -
Respons http untuk operasi kemas kini harus mengandungi badan berikut:
{ "ticket": { "id": "af41766e-76ea-43b5-86c1-8ba382edd4dc", "title": "ticket updated title", "price": 9, "date_created": "2023-01-06 09:07:24", "date_updated": "2023-01-06 10:08:24" } }
Ini bermakna selepas saya mengemas kini dokumen tiket, tiada apa-apa selain nilai medan title 或 price
之外,我还需要更新 date_updated
yang dikemas kini.
Ia berfungsi pada masa ini, tetapi saya ingin tahu sama ada cara saya mengekod adalah cara untuk melakukannya. Seperti yang anda lihat dalam contoh kod, saya menggunakan transaksi untuk mengemas kini tiket. Saya tidak menemui cara untuk mendapatkan semula nilai kemas kini medan dateupdated
selain membaca tiket yang dikemas kini sekali lagi.
Entiti domain ditakrifkan seperti berikut:
package tixer import ( "context" "time" "github.com/google/uuid" ) type ( // ticketid represents a unique identifier for a ticket. // it's a domain type. ticketid uuid.uuid // ticket represents an individual ticket in the system. // it's a domain type. ticket struct { id ticketid title string price float64 datecreated time.time dateupdated time.time } )
Saya akan melampirkan komunikasi dengan firestore dari sudut penciptaan dan kemas kini di sini:
// Storer persists tickets in Firestore. type Storer struct { client *firestore.Client } func NewStorer(client *firestore.Client) *Storer { return &Storer{client} } func (s *Storer) CreateTicket(ctx context.Context, ticket *tixer.Ticket) error { writeRes, err := s.client.Collection("tickets").Doc(ticket.ID.String()).Set(ctx, createTicket{ Title: ticket.Title, Price: ticket.Price, }) // In this case writeRes.UpdateTime is the time the document was created. ticket.DateCreated = writeRes.UpdateTime return err } func (s *Storer) UpdateTicket(ctx context.Context, ticket *tixer.Ticket) error { docRef := s.client.Collection("tickets").Doc(ticket.ID.String()) err := s.client.RunTransaction(ctx, func(ctx context.Context, tx *firestore.Transaction) error { doc, err := tx.Get(docRef) if err != nil { switch { case status.Code(err) == codes.NotFound: return tixer.ErrTicketNotFound default: return err } } var t persistedTicket if err := doc.DataTo(&t); err != nil { return err } t.ID = doc.Ref.ID if ticket.Title != "" { t.Title = ticket.Title } if ticket.Price != 0 { t.Price = ticket.Price } return tx.Set(docRef, updateTicket{ Title: t.Title, Price: t.Price, DateCreated: t.DateCreated, }) }) if err != nil { return err } updatedTicket, err := s.readTicket(ctx, ticket.ID) if err != nil { return err } *ticket = updatedTicket return nil } func (s *Storer) readTicket(ctx context.Context, id tixer.TicketID) (tixer.Ticket, error) { doc, err := s.client.Collection("tickets").Doc(id.String()).Get(ctx) if err != nil { switch { case status.Code(err) == codes.NotFound: return tixer.Ticket{}, tixer.ErrTicketNotFound default: return tixer.Ticket{}, err } } var t persistedTicket if err := doc.DataTo(&t); err != nil { return tixer.Ticket{}, err } t.ID = doc.Ref.ID return toDomainTicket(t), nil } type ( // persistedTicket represents a stored ticket in Firestore. persistedTicket struct { ID string `firestore:"id"` Title string `firestore:"title"` Price float64 `firestore:"price"` DateCreated time.Time `firestore:"dateCreated"` DateUpdated time.Time `firestore:"dateUpdate"` } // createTicket contains the data needed to create a Ticket in Firestore. createTicket struct { Title string `firestore:"title"` Price float64 `firestore:"price"` DateCreated time.Time `firestore:"dateCreated,serverTimestamp"` DateUpdated time.Time `firestore:"dateUpdate,serverTimestamp"` } // updateTicket contains the data needed to update a Ticket in Firestore. updateTicket struct { Title string `firestore:"title"` Price float64 `firestore:"price"` DateCreated time.Time `firestore:"dateCreated"` DateUpdated time.Time `firestore:"dateUpdate,serverTimestamp"` } ) func toDomainTicket(t persistedTicket) tixer.Ticket { return tixer.Ticket{ ID: tixer.TicketID(uuid.MustParse(t.ID)), Title: t.Title, Price: t.Price, DateCreated: t.DateCreated, DateUpdated: t.DateUpdated, } }
Penyelesaian
Jika saya faham dengan betul, medan DateUpdated
ialah cap waktu sebelah pelayan, yang bermaksud nilainya ditentukan oleh pelayan apabila ia menulis nilai pada lapisan storan (kononnya transformasi medan). Memandangkan operasi tulis dalam SDK Firestore tidak mengembalikan data hasil operasi, satu-satunya cara untuk mendapatkan semula nilai itu ke dalam aplikasi sebenarnya adalah dengan melakukan operasi baca tambahan selepas menulis untuk mendapatkannya.
SDK tidak akan melakukan bacaan ini secara automatik kerana ia adalah operasi bercaj dan tidak diperlukan dalam banyak kes. Jadi dengan meminta kod anda melaksanakan bacaan itu, anda boleh memutuskan sama ada untuk menanggung kos ini.
Atas ialah kandungan terperinci Adakah saya memerlukan perjalanan pergi balik tambahan ke firestore untuk membaca medan cap masa yang dibuat dan dikemas kini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Artikel ini menerangkan mekanisme import pakej Go: Dinamakan import (mis., Import & quot; fmt & quot;) dan import kosong (mis., Import _ & quot; fmt & quot;). Dinamakan import membuat kandungan pakej boleh diakses, sementara import kosong hanya melaksanakan t

Artikel ini memperincikan penukaran yang cekap hasil pertanyaan MySQL ke dalam kepingan struct go. Ia menekankan menggunakan kaedah imbasan pangkalan data/SQL untuk prestasi optimum, mengelakkan parsing manual. Amalan terbaik untuk pemetaan medan struct menggunakan tag db dan robus

Artikel ini menerangkan fungsi Newflash () Beego untuk pemindahan data antara halaman dalam aplikasi web. Ia memberi tumpuan kepada menggunakan NewFlash () untuk memaparkan mesej sementara (kejayaan, kesilapan, amaran) antara pengawal, memanfaatkan mekanisme sesi. Limita

Artikel ini meneroka kekangan jenis adat Go untuk generik. Ia memperincikan bagaimana antara muka menentukan keperluan jenis minimum untuk fungsi generik, meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Artikel ini juga membincangkan batasan dan amalan terbaik

Artikel ini menunjukkan penciptaan dan stub di GO untuk ujian unit. Ia menekankan penggunaan antara muka, menyediakan contoh pelaksanaan mengejek, dan membincangkan amalan terbaik seperti menjaga mocks fokus dan menggunakan perpustakaan penegasan. Articl

Artikel ini memperincikan penulisan fail yang cekap di GO, membandingkan OS.WriteFile (sesuai untuk fail kecil) dengan os.openfile dan buffered menulis (optimum untuk fail besar). Ia menekankan pengendalian ralat yang teguh, menggunakan penangguhan, dan memeriksa kesilapan tertentu.

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Artikel ini meneroka menggunakan alat pengesanan untuk menganalisis aliran pelaksanaan aplikasi GO. Ia membincangkan teknik instrumentasi manual dan automatik, membandingkan alat seperti Jaeger, Zipkin, dan OpenTelemetry, dan menonjolkan visualisasi data yang berkesan
