Firebase 查询过滤不允许 whereField 和 orderBy 的不同字段

Firebase Query filtering not allowing different fields for whereField and orderBy

本质上,我在做的事情类似于snapchat故事。也就是说,我正在为同一集合“故事”下的每个故事创建一个文档。问题开始于我需要能够同时请求不同领域的故事。

例如。故事数据模型:

struct StoryModel: Identifiable {
    var id: String
    var isLive: Bool?
    var name: String?
    var description: String?
    var isPrivate: Bool?
    var userIDsJoined: [String]?
    var userIDsWatching: [String]?
    var startDate: Date?
    var endDate: Date?
    var hostInfoRef: DocumentReference?
}

我希望能够在 isLive 上执行 whereField,但也在同一个查询中通过 userIDsWatching 进行排序。我怎么还能做这种查询:

Firestore.firestore()
    .collection("Stories")
    .whereField("isLive", isEqualTo: true)
    .order(by: "userIDsWatching", descending: true)
    .limitTo(5)

此查询无效,请参阅此 link 了解原因。

我唯一的选择是创建一个单独的集合来存储实时故事,并在 isLive 为 false 时将它们移动到“故事”集合。

如您所写,出现错误:“您不能在不同的字段上使用 whereFieldsortBy。”使用 sortBy 方法的 Firestore 查询需要第一个 whereField 方法与 sortBy 方法相同。

所以你可以这样写代码:

Firestore.firestore()
    .collection("Stories")
    .whereField("created") // it cannot be boolean value same as array like you have in userIdsWatching field.
    .sortBy("created", descending: true)
    .limitTo(5)

或者我很确定它可以像那样工作:

Firestore.firestore()
    .collection("Stories")
    .whereField("created") // This line has to be first, because of you sort by it.
    .whereField("isLive", isEqualTo: true)
    .sortBy("created", descending: true)
    .limitTo(5)

在第二个示例中,重要的可能是 .whereFields 函数的顺序。首先需要与 sortBy 方法中的相同。在开始学习编程之前,先学习如何通过理解文本来阅读。您的错误准确说明了您在代码中的错误。

而且 Firestore 没有过滤任何东西。 Firestore 只是从数据库中挑选和排序文档。过滤词不正确,为什么你有 whereField 方法,没有 filterByField 方法。

我发现了一件事。您知道 swift 中的示例与您的不同吗?

citiesRef
    .whereField("population", isGreaterThan: 100000)
    .order(by: "population") // this line is diferent same as bellow
    .limit(to: 2)

在@Mises 的帮助下,我找到了一个更好的方向,并最终打印出一个错误。错误是“Listen for query at Stories failed: The query requires an index. You can create it here...”

我的问题的解决方案是:

  1. 在 StoryModel 中创建一个新字段,例如“totalViewing: Int?”
  2. 为故事集创建索引

第一个修复是因为字段数组 returns 上的 orderBy 值如下: 我认为像“userIDsWatching”这样的字段上的 orderBy 会按照数组中值最多的文档对它们进行排序。根据以上link @Doug Stevenson 提供的,这是错误的。

第二个修复是我不知道你甚至可以做的事情。我创建了一个索引,现在通过 运行 这个查询它可以正常工作。

Firestore.firestore()
    .collection("Stories")
    .whereField("isLive", isEqualTo: true)
    .order(by: "totalViewing", descending: true)
    .limit(to: 5)

在这两个更改之间,我找到了一种方法,可以按一个字段排序,然后在完全不同的字段上执行 whereField。