user icon

FirestoreのServerTimestampさん

有能!

サーバー側で採時するので集計対象の抽出などに安心して使用できます。
これのおかげで必要なデータ取得数を大幅に削減できています。
Firestoreだとデータ取得数は速度や効率だけでなく課金に直結しますしね。

管理画面でデータを時系列に並べたりするのにも便利なのでドキュメント登録時には必ず入れておいたほうが良いくらいの有能さです。

Webでは

import firebase from '~/plugins/firebase'

payload.createdAt = firebase.firestore.FieldValue.serverTimestamp()
await db.collection('コレクション名').add(payload)

(Functionsなど)node.jsでfirebase-adminを使用する場合は

const admin = require("firebase-admin");

const serviceAccount = require("サービスアカウントの鍵.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

admin.firestore().collection("コレクション名").doc("ドキュメントのキー").set({
  updatedAt: admin.firestore.FieldValue.serverTimestamp()
});

といった感じでサーバー側でTimestampを投入するように指示できます。

でも注意点が。

登録直後にドキュメントを取得するとTimestampが入ってない状態で返ってきます(2019年3月)。await等で完了をまっても、です。
ただしこれはフロントエンドからの取得の話でonCreateで起動されたFunctionsではさすがにちゃんと入っているようです。

フロントエンドで登録直後にデータを取得し(Server)Timestampを利用するには採時されるのを待つ必要があります。タイミングの問題ってことです(;´Д`)

私の場合は操作ログ記録のための変更後のドキュメント取得でしたので、ログ登録という処理の性質上ユーザーから見える必要はないので非同期に500msディレイして取得・登録処理を行うようにしました(lodashのdelayを利用)

なんか記事書いててもホントかよって感じですが。

Facebooktwitterlinkedintumblrmail

タグ: ,

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)