没错,像大多数数据库一样,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' })
使用以下类似的方式设置您的查询:
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);
FieldValue.serverTimestamp
。但我想确保不强制要求将名称为“timestamp”的键存储。 - Vicky Thakorfirebase.firestore.FieldValue.serverTimestamp()
而不是firebase.database.ServerValue.TIMESTAMP
。 - Zvi Karp