Firestore文档的最大字段数?

时间:2019-06-03 13:41:25

标签: firebase google-cloud-firestore full-text-search

现在我有一个products集合,我将产品存储为以下文档:

文档ID:

title: STRING,
price: NUMBER,
images: ARRAY OF OBJECTS,
userImages: ARRAY OF OBJECTS,
thumbnail: STRING,
category: STRING

注意::我的网络应用大约有1000种产品。

我正在考虑在客户端进行全文搜索,同时还保存数据库读取,因此我正在考虑在Firestore上复制数据并将所有产品的部分副本保存到单个文档中以进行发送到客户端,这样我就可以实现客户端全文搜索。

我将使用一个包含1000个字段的文档来创建allProducts集合。这可能吗?

所有产品集合

包含一个具有以下字段的文档:

每个字段都将包含带有产品详细信息的MAP(对象)。

document_1_ID: {  // Same ID as the 'products' collection
  title: STRING,
  price: NUMBER,
  category: STRING,
  thumbnail
},
document_2_ID: {
  title: STRING,
  price: NUMBER,
  category: STRING,
  thumbnail
},
// AND SO ON...

注意:我仍将保持products集合不变。

问题

是否可以有一个包含1000个字段的文档?限制是多少?

我正在研究这个问题,因为自从我执行客户端全文搜索以来,每个用户都需要访问我的整个产品数据库。而且,我不希望每个用户都阅读我拥有的每个文档,因为我认为这样做的成本不会很好地扩展。

注意2::我知道文档的最大大小为1mb。

4 个答案:

答案 0 :(得分:4)

根据this document,除了每个文档1MB的限制外,每个文档的索引条目限制为40,000。因为每个字段都出现在2个索引中(升序和降序),所以最大字段数为20,000

我制作了一个Node.js程序进行测试,可以确认可以创建20,000个字段,但不能创建20001个字段。

如果您尝试设置超过20,000个字段,则会出现异常:

INVALID_ARGUMENT:实体的索引条目过多

select a.name || ' ' || b.name as name 
from a join b
on ......
order by lower(a.name || ' ' || b.name)

答案 1 :(得分:2)

根据documentation,对文档中的字段数没有规定的限制。但是,一个文档最多只能有40,000个索引条目,随着文档包含默认情况下被索引的更多字段的增加,该条目将不断增加。

答案 2 :(得分:2)

  

我将创建具有1000个字段的单个文档的allProducts集合。这可能吗?

您可以在文档中添加任意数量的数据,但前提是您要保持在限制范围之内。因此,问题不在于您重复数据,而是文档有限制。因此,在文档中可以放入多少数据方面存在一些限制。根据有关https://docs.nestjs.com/guards的官方文档:

  

文档的最大大小:1 MiB(1,048,576字节)

如您所见,单个文档中的数据总数限制为1 MiB。当我们谈论存储文本时,可以存储很多,但是随着文档越来越大,请注意此限制。

如果您要在文档中存储大量数据,而这些文档应由许多管理员进行更新,则需要注意另一个限制。因此,每个文档每秒只能写入1次。因此,如果您遇到管理员试图一次写/更新同一文档中的产品的情况,您可能会开始发现其中某些写操作失败。因此,也要注意此限制。

  

是否可以有一个包含1000个字段的文档?

最多可能有40,000个房屋,但对您而言没有好处。我说这是因为每次执行查询(获取文档)时,只会返回一个文档。因此,您无法在单个文档中实现搜索算法并期望获得Product对象作为回报。

  

我不希望每个用户都阅读我拥有的每个文档,因为我认为这样做的成本无法很好地扩展。

下载整个集合以在客户端搜索字段根本不切实际,而且成本也很高。这就是为什么官方文档推荐像usage and limits这样的第三方搜索服务的原因。

对于Android,请从以下帖子中查看我的答案:

答案 3 :(得分:2)

Firebase每个文档最多只能有2万个字段。 https://www.youtube.com/watch?v=o7d5Zeic63s

相关问题