首页 > 解决方案 > 如何订购由仅包含一个对象的 firebase 集合

问题描述

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

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

这是我的代码。

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

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

标签: javascriptreactjsfirebasegoogle-cloud-firestore

解决方案


查询的问题:

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

索引问题:

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

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

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

  1. FirebaseError:找不到匹配的索引
  2. 需要 Firebase 索引,但未提供链接

推荐阅读