开发者问题收集

在 Firestore 文档中添加时间戳

2018-08-14
110022

我是 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
}
3个回答
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 
})
Saccarab
2018-08-14

使用 firestore Timestamp 类, firebase.firestore.Timestamp.now()

由于 firebase.firestore.FieldValue.serverTimestamp() 不适用于 firestore 中的 add 方法。 参考

johnson lai
2019-12-12

没错,与大多数数据库一样,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);
uɥƃnɐʌuop
2021-03-02