【问题标题】:How to get first and last document in collection?如何获取集合中的第一个和最后一个文档?
【发布时间】:2020-11-16 10:28:07
【问题描述】:

我有很多文档的 集合。
我想获取集合中的第一个和最后一个文档(按时间戳排序)。

我该如何查询?

【问题讨论】:

  • Firestore 默认情况下不对文档进行时间戳排序。您必须为每个文档添加一个时间戳字段,并在查询中使用它。您将需要至少两个查询才能仅获取这两个文档。

标签: google-cloud-firestore javascript firebase google-cloud-firestore


【解决方案1】:

我不确定您要按哪个Timestamp 排序,所以我假设您的doc 看起来像这样

/id/: {
 timestamp: FirebaseFirestore.Timestamp
 // ... whatever other properties
}

您可以通过.orderBy 方法查询CollectionReference<T> 来获得Query

const collectionQuery = firestore
  .collection('collectionName')
  .orderBy('timestamp', 'asc')

现在我们想要获得一个QuerySnapshot(这将允许我们访问文档),通过使用.get() 方法。

const collectionSnapshot = await collectionQuery.get()

现在我们只访问第一个和最后一个文档。

const firstDocument = collectionSnapshot.isEmpty
 ? null
 : collectionSnapshot.docs[0]
const lastDocument = collectionSnapshot.isEmpty
 ? null
 : collectionSnapshot.docs[collectionSnapshot.docs.length - 1]

瞧,你有你的第一个也是最后一个文件! :-)

【讨论】:

  • 第一个,最后一个 - 并下载其间的每个文档。相当昂贵的手术。另一个答案 only 查询两个文档,并且只产生两个文档的 read 成本。
  • @LeadDreamer 实际上我很好奇性能更重,访问文档或两个单独的 orderBy 查询上的两个异步调用,尽管它们有限制,所以我假设它们更多高性能。我很好奇limit 在内部是否真的对CollectionReference 做了一些事情,或者只是获取然后简单地返回第一个QueryDocument
  • limit(1) literally 只获取一个文档,因此需要读取 1 次。它只传输一个文档,因此使用的带宽更少。它只传输一份文件,因此花费的时间更少。全部在服务器上。 如果,出于某种原因,您将随后 总是需要其余的文档,然后它们将被缓存,但我不'没有看到 性能 原因 使用 .limit()
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多