我有一个返回健康食品列表的应用程序。产品集合中大约有10000-20000种食物(文件)。
使用arrayContains
在多个字段中查询这些食物。这可能是类别,子类别,并且当用户在搜索栏中进行搜索时,它是一个包含在关键字数组中的数组。
对于这么多产品,我计划在获取文档时对查询结果进行分页。问题是我需要知道结果的数量才能向用户显示结果的总数。
我已经阅读过,对于一个查询,您需要支付一读的费用,然后如果您得到这些文档,则将按文档收取进一步的费用。是否可以在不获取所有文档的情况下获取查询结果的数量。
我在这里看到了这个答案:
Get size of the query in Firestore
但是在此示例中,他们说要使用一个似乎不实用的计数器,因为当用户搜索时我正在使用关键字查询,而当用户进行过滤时我正在使用类别和子类别的混合体。
谢谢
答案 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
})