Firebase firestore 查询:“错误:9 FAILED_PRECONDITION:查询需要索引。您可以在此处创建它”

Posted

技术标签:

【中文标题】Firebase firestore 查询:“错误:9 FAILED_PRECONDITION:查询需要索引。您可以在此处创建它”【英文标题】:Firebase firestore query: "Error: 9 FAILED_PRECONDITION: The query requires an index. You can create it here" 【发布时间】:2018-12-15 10:18:59 【问题描述】:

我有一个我认为是对名为“电子邮件”的集合的简单查询:

 const emailQuery = admin
    .firestore()
    .collection('email')
    .where('sendAt', '>=', new Date())
    .where('orderId', '==', doc.orderId)
    .where('brandId', '==', doc.brandId);

我收到这篇文章主题中的错误,表明我需要为此查询创建索引。我尝试为相关字段创建一对,但我不确定为什么需要它,因为只订购了一个字段 - 尽管有这些索引,但错误仍然存​​在:

sendAt -> Ascending, brandId -> Ascending, orderId -> Ascending

sendAt -> Descending, brandId -> Ascending, orderId -> Ascending

如您所见,我没有指定orderBy。另外,sendAt 是一个日期,而另外两个是不需要排序的简单字符串。

我需要什么样的索引,或者我该如何解决这个错误?

谢谢!

【问题讨论】:

【参考方案1】:

来自documentation:

如果您尝试使用不映射的范围子句进行复合查询 到现有索引,您会收到错误。错误信息包括 在 Firebase 控制台中创建缺失索引的直接链接。

换一种说法:当您使用涉及<> 的比较时,该字段的查询中存在隐式排序。与其他字段的条件结合使用时,特定集合 ID 需要索引。

您开始在问题标题中引用的错误消息应包含一个指向控制台的链接,该控制台将为该查询创建所需的索引。只需点击该链接并授权创建索引即可。

【讨论】:

谢谢道格。明白了,虽然我认为这属于 Firebase 报告的简单查询的范围,应该包含内置索引(您提供的文档链接不起作用)。该错误确实包含一个链接,尽管我在 Firebase 上有几个帐户,并且该链接似乎假定了错误的帐户。我敢肯定,我可以多玩一点。 链接已修复。简单查询是那些只涉及单个字段,或内容完全匹配的多个字段(无范围)。 感谢@DougStevenson,您节省了我的时间:)

以上是关于Firebase firestore 查询:“错误:9 FAILED_PRECONDITION:查询需要索引。您可以在此处创建它”的主要内容,如果未能解决你的问题,请参考以下文章

在 Firestore 查询中实现 OR - Firebase firestore

Firestore 分页 - 是不是有任何与 firebase 的 limitToLast 兼容的查询?

Firebase Firestore从数组Javascript查询

如何更新单个 Firebase Firestore 文档

SwiftUI Firebase Firestore 查询函数

Firestore:如果两个侦听器监听相同的查询 firebase 维护两个不同的查询快照?