【问题标题】:Maximum number of fields for a Firestore document?Firestore 文档的最大字段数?
【发布时间】:2019-10-19 01:58:29
【问题描述】:

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

文档ID:

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

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

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

我将创建 allProducts 集合,其中包含一个包含 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。

【问题讨论】:

  • 让我告诉你我是如何解决它的,我在一个集合中有 35k 文档,为了实现我们搬到 algolia 的文本搜索,可能你想检查一下,现在 firebase 不支持文本搜索,如果您与 algolia 保持同步 firebase,您可以将搜索功能委托给它......对我们来说,每月花费大约 30 美元
  • 谢谢@andresmijares!这就是 Firestore 的建议。但现在我的项目负担不起。您知道是否可以为三个不同的 Firebase/Firestore 项目共享同一个 Algolia 帐户?想象一下,我有 3 个网站,每个网站都有 12k 个文档。我可以使用相同的 Algolia 费用为这 3 个网站提供全文搜索吗?还是我需要为每个人设置一个帐户?
  • algolia 按索引工作,相当于一个集合,他们为您提供一个可以使用的sdk,每个项目都可以拥有自己的云功能来同步,这是完全可能的:)
  • 非常感谢。我会再看看!

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


【解决方案1】:

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

您可以在文档中添加任意数量的数据,但前提是您保持在限制范围内。所以问题不在于您复制数据的事实,问题在于文档有限制。因此,在您可以将多少数据放入文档时存在一些限制。根据usage and limits的官方文档:

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

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

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

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

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

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

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

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

【讨论】:

  • 他的真正意思是将产品存储为地图,其中产品的Id 为键,产品名称为值。这样他就可以获取该单个文档,执行搜索查询,收集匹配的文档 ID,创建 DocumentReferences,然后使用 getall() 函数,而不会浪费内置查询的读取和请求。
【解决方案2】:

根据this document,除了每个文档 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);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 2018-09-29
        • 2018-11-22
        • 1970-01-01
        • 2018-06-21
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多