Firestore查询无需阅读文档即可获得结果的大小?

时间:2019-07-18 05:38:52

标签: firebase google-cloud-firestore

我有一个返回健康食品列表的应用程序。产品集合中大约有10000-20000种食物(文件)。

使用arrayContains在多个字段中查询这些食物。这可能是类别,子类别,并且当用户在搜索栏中进行搜索时,它是一个包含在关键字数组中的数组。

对于这么多产品,我计划在获取文档时对查询结果进行分页。问题是我需要知道结果的数量才能向用户显示结果的总数。

我已经阅读过,对于一个查询,您需要支付一读的费用,然后如果您得到这些文档,则将按文档收取进一步的费用。是否可以在不获取所有文档的情况下获取查询结果的数量。

我在这里看到了这个答案:

Get size of the query in Firestore

但是在此示例中,他们说要使用一个似乎不实用的计数器,因为当用户搜索时我正在使用关键字查询,而当用户进行过滤时我正在使用类别和子类别的混合体。

谢谢

2 个答案:

答案 0 :(得分:1)

  

有了这么多产品,我计划在获取文档时对查询结果进行分页。

这是一个非常好的决定,因为一次获取​​10000-20000种食物(文档)是不可行的。原因之一是成本,它会非常昂贵,其次是尝试加载如此大量的数据时,您会得到OutOfMemoryError

  

问题是我需要知道结果数量才能向用户显示结果总数。

Firestore中没有办法,因此您可以提前知道结果集的大小。

  

是否可以在不获取所有文档的情况下获取查询结果的数量。

否,您必须分页查询返回的所有结果以获取总大小。

  

但是在这个例子中,他们说使用计数器,因为我在用户搜索关键字时使用了查询,所以这似乎并不实用

是的,该解决方案无法满足您的需求,因为它解决了将所有文档数量存储在集合中而由查询返回。据我所知,以这种云托管的NoSQL实时数据库需要“大规模扩展”的方式来提供信息是不可扩展的。

答案 1 :(得分:0)

对于任何未来的潜伏者,此问题的“解决方案”是使用游标对结果进行分页,直到查询不再返回任何文档。当查询快照为空时,为您的游标和句柄返回 undefined

const LIMIT = 100
const offset = req.query.offset

const results = db.collection(COLLECTION)
   .offset(offset)
   .limit(LIMIT)
   .get()

const docs = results.docs.map(doc => doc.data())

res.status(200).send({
    data: docs,
    // Return the next offset or undefined if no docs are returned anymore.
    offset: docs.length > 0 ? offset + LIMIT : undefined
})