在 Firestore 文档中添加时间戳
我是 Firestore 的新手。Firestore 文档说...
Important : Unlike "push IDs" in the Firebase Realtime Database, Cloud Firestore auto-generated IDs do not provide any automatic ordering. If you want to be able to order your documents by creation date, you should store a timestamp as a field in the documents.
参考: https://firebase.google.com/docs/firestore/manage-data/add-data
那么我必须在文档中创建
timestamp
作为键名吗?或者
created
足以满足 Firestore 文档中的上述声明。
{
"created": 1534183990,
"modified": 1534183990,
"timestamp":1534183990
}
firebase.firestore.FieldValue.serverTimestamp()
据我所知,无论您想叫它什么都可以。然后您可以使用 orderByChild('created')。
我在设置时间时也主要使用 firebase.database.ServerValue.TIMESTAMP
ref.child(key).set({
id: itemId,
content: itemContent,
user: uid,
created: firebase.database.ServerValue.TIMESTAMP
})
使用 firestore Timestamp 类,
firebase.firestore.Timestamp.now()
。
由于
firebase.firestore.FieldValue.serverTimestamp()
不适用于 firestore 中的
add
方法。
参考
没错,与大多数数据库一样,Firestore 不存储创建时间。为了按时间对对象进行排序:
选项 1:在客户端上创建时间戳(不保证正确性):
db.collection("messages").doc().set({
....
createdAt: firebase.firestore.Timestamp.now()
})
这里最大的警告是
Timestamp.now()
使用本地机器时间。因此,如果在客户端机器上运行,则
无法保证
时间戳是准确的。如果您在服务器上设置此项,或者保证顺序不是那么重要,那么可能会没问题。
选项 2:使用时间戳标记:
db.collection("messages").doc().set({
....
createdAt: firebase.firestore.FieldValue.serverTimestamp()
})
时间戳标记是一个令牌,它告诉 Firestore 服务器在第一次写入时设置时间服务器端。
如果您在写入之前读取标记(例如,在侦听器中),它将为 NULL,除非您像这样读取文档:
doc.data({ serverTimestamps: 'estimate' })
使用类似以下内容设置您的查询:
// quick and dirty way, but uses local machine time
const midnight = new Date(firebase.firestore.Timestamp.now().toDate().setHours(0, 0, 0, 0));
const todaysMessages = firebase
.firestore()
.collection(`users/${user.id}/messages`)
.orderBy('createdAt', 'desc')
.where('createdAt', '>=', midnight);
请注意,此查询使用本地机器时间(
Timestamp.now()
)。如果您的应用在客户端上使用正确的时间确实很重要,您可以利用 Firebase 实时数据库的此功能:
const serverTimeOffset = (await firebase.database().ref('/.info/serverTimeOffset').once('value')).val();
const midnightServerMilliseconds = new Date(serverTimeOffset + Date.now()).setHours(0, 0, 0, 0);
const midnightServer = new Date(midnightServerMilliseconds);