【问题标题】:How to orderBy the firebase collection containing only one object如何订购由仅包含一个对象的 firebase 集合
【发布时间】:2021-07-19 16:23:54
【问题描述】:

我正在尝试按仅包含一个对象且该对象包含一个数组的“collectionGroup”进行排序。像这样

名为“Calculations”的 collectionGroup 仅包含一个名为“0”的 Doc,并且该 Doc 包含一个数组,现在我正在尝试使用 orderBy( ) 方法,但它不起作用。

这是我的代码。

  calculations = await db
    .firestore()
    .collectionGroup("Calculations")
    .orderBy("symbol", "asc")
    .limit(limit)
    .get()
  }

正如您在图片中看到的那样,每个数组中都有一个值“符号”,所以我尝试使用它来订购但无法这样做,firebase 说没有找到匹配的索引。

【问题讨论】:

  • 您不能以这种方式订购阵列。您应该将这些数组条目中的每一个存储到集合中的文档中并以这种方式排序
  • 我想对其进行分页,有没有其他方法可以在不应用 orderBy() 的情况下进行分页。有什么想法吗?

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

查询问题:

您不能在对象数组上使用orderBy 或array-contains 之类的运算符,除非您知道this answer 中解释的完整对象。理想情况下,您应该使用子集合而不是数组。 “计算”似乎已经是一个子集合,那么如果您将计算存储在它的文档中而不是单个文档中的数组中,那么您的查询应该可以正常工作。

索引问题:

如果您看到“无匹配索引”错误,则表示查询需要索引。您可以从 Firebase 控制台手动create index,也可以使用错误抛出的链接(曾经被抛出)创建它。客户端 SDK 中有一个 issue,索引所需的错误不包括创建索引的链接。存在手动创建索引但未按预期工作的问题。

但是,Admin SDK 仍然会引发包含单击以创建索引链接的错误,我建议您尝试使用云函数模拟器在本地云函数中运行您的查询,并使用错误引发的链接。

您可以参考这些答案,详细了解如何使用我的 Admin SDK 抛出的链接创建索引:

  1. FirebaseError: No matching index found
  2. Firebase index required but no link provided

【讨论】:

  • 我想对其进行分页,有没有其他方法可以在不应用 orderBy() 的情况下进行分页。有什么想法吗?
  • @MuhammadHassaanAther 不,如果它们在一个数组中,那么你最终会获取整个数组。最好将计算拆分到他们自己的文档中,然后您可以对其进行分页。
【解决方案2】:

您将不得不重新构建您的数据 - 可能会将您的“数组”内容移动到文档的子集合中。 Firestore“数组”非常没有用 - 我将“数组”放在引号中的原因是:

Firestore“数组”绝对不是数组。它们是有序列表,通常按照它们添加到数组中的顺序。 SDK 将它们作为数组呈现给客户端,但 Firestore 本身不会将它们存储为实际数组 - 您在控制台中看到的数字是顺序,而不是索引。匹配元素或在数组中查询(例如,arrayContains)需要匹配整个元素 - 如果存储对象的有序列表,则不能查询子元素上的“数组”。

客户端 SDK 通常将数组/“有序列表”中的值作为数组呈现给您 - 这与大多数语言没有原始元素(即有序列表)有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多