Firestore 文档的最大字段数?

cbd*_*per 3 full-text-search firebase google-cloud-firestore

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

文档 ID:

title: STRING,
price: NUMBER,
images: ARRAY OF OBJECTS,
userImages: ARRAY OF OBJECTS,
thumbnail: STRING,
category: STRING
Run Code Online (Sandbox Code Playgroud)

注意:我的 Web 应用程序有大约 1000 种产品。

我正在考虑在客户端进行全文搜索,同时还节省了数据库读取,所以我正在考虑在 Firestore 上复制我的数据并将我所有产品的部分副本保存到一个文档中以将其发送给客户端,所以我可以用它实现客户端全文搜索。

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

所有产品:集合

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

每个字段都将包含一个带有产品详细信息的 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...
Run Code Online (Sandbox Code Playgroud)

注意:我仍然会保持products收藏完整。

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

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

NOTE2:我知道文档的最大大小是 1mb。

Dou*_*son 8

根据文档,文档中的字段数量没有明确的限制。但是,一个文档最多只能有 40,000 个索引条目,随着文档包含更多默认索引的字段,该索引条目也会增长。


Ale*_*amo 7

我将创建 allProducts 集合,其中包含一个包含 1000 个字段的文档。这可能吗?

您可以在文档中添加任意数量的数据,但前提是保持在限制范围内。所以问题不在于你复制数据,问题在于文档有限制。因此,当涉及到可以放入文档的数据量时,存在一些限制。根据有关使用和限制的官方文档:

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

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

如果您在文档中存储大量数据并且这些文档应该由许多管理员更新,那么您需要注意另一个限制。因此,您在每个文档上每秒只能写入 1 次。因此,如果您遇到管理员试图同时在同一文档中编写/更新产品的情况,您可能会开始看到其中一些写入失败。所以,也要小心这个限制。

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

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

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

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

对于 Android,请参阅我在以下帖子中的回答:

  • 他实际上的意思是将产品存储为地图,以产品的“Id”作为键,以产品的名称作为值。这样他就可以获取单个文档,执行搜索查询,收集匹配的文档 ID,创建“DocumentReferences”,然后使用“getall()”函数,而不会浪费内置查询的读取和请求。 (2认同)

And*_*ena 5

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

我做了一个 Node.js 程序来测试它,我可以确认我可以创建 20,000 个字段,但我不能创建 20,001。

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

INVALID_ARGUMENT:实体的索引条目过多

  // Setting 20001 here throws "INVALID_ARGUMENT: too many index entries for entity"
  const indexPage = Array.from(Array(20000).keys()).reduce((acc, cur) => {
    acc[`index-${cur}`] = cur;
    return acc;
  }, {});
  await db.doc(`test/doc`).set(indexPage);
Run Code Online (Sandbox Code Playgroud)


小智 5

Firebase 对每个文档的字段限制为 20k。 https://www.youtube.com/watch?v=o7d5Zeic63s