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 时将它们移动到“故事”集合。
如您所写,出现错误:“您不能在不同的字段上使用 whereField
和 sortBy
。”使用 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...”
我的问题的解决方案是:
- 在 StoryModel 中创建一个新字段,例如“totalViewing: Int?”
- 为故事集创建索引
第一个修复是因为字段数组 returns 上的 orderBy 值如下:
我认为像“userIDsWatching”这样的字段上的 orderBy 会按照数组中值最多的文档对它们进行排序。根据以上link @Doug Stevenson 提供的,这是错误的。
第二个修复是我不知道你甚至可以做的事情。我创建了一个索引,现在通过 运行 这个查询它可以正常工作。
Firestore.firestore()
.collection("Stories")
.whereField("isLive", isEqualTo: true)
.order(by: "totalViewing", descending: true)
.limit(to: 5)
在这两个更改之间,我找到了一种方法,可以按一个字段排序,然后在完全不同的字段上执行 whereField。
本质上,我在做的事情类似于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 时将它们移动到“故事”集合。
如您所写,出现错误:“您不能在不同的字段上使用 whereField
和 sortBy
。”使用 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...”
我的问题的解决方案是:
- 在 StoryModel 中创建一个新字段,例如“totalViewing: Int?”
- 为故事集创建索引
第一个修复是因为字段数组 returns 上的 orderBy 值如下:
第二个修复是我不知道你甚至可以做的事情。我创建了一个索引,现在通过 运行 这个查询它可以正常工作。
Firestore.firestore()
.collection("Stories")
.whereField("isLive", isEqualTo: true)
.order(by: "totalViewing", descending: true)
.limit(to: 5)
在这两个更改之间,我找到了一种方法,可以按一个字段排序,然后在完全不同的字段上执行 whereField。