我想查询我的 firestore 数据库中的一个集合
我想查询以获取当前用户提要的所有帖子。 我目前这样做是这样的
let ref = Firestore.firestore().collection("feedItems")
.whereField("uid", isEqualTo: uid)
.whereField("wasViewed", isEqualTo: false)
.whereField("isResharedPost", isEqualTo: false)
.whereField("story", isEqualTo: false)
.whereField("createdAt", isGreaterThan: dateFilter as Any)
.order(by: "createdAt", descending: false)
.limit(to: 25)
ref.getDocuments { (snapshot, err) in
我现在添加故事选项,并希望查询同一集合中故事字段等于 true 的 feedItems
但是在这种情况下,我还需要确保只获取 24 小时内的对象。所以我希望我的查询有两个略有不同的过滤器集
一个
.whereField("story", isEqualTo: true)
.whereField("postCreatedAt", isGreaterThan: storyFilter as Any)
还有一个带有
.whereField("story", isEqualTo: false)
.whereField("createdAt", isGreaterThan: dateFilter as Any)
所有其他字段保持不变,顺序和限制保持不变。
这可以组合成一个复合查询吗?
我已经尝试过这样的
let ref = Firestore.firestore().collection("feedItems")
ref
.whereField("uid", isEqualTo: uid)
.whereField("wasViewed", isEqualTo: false)
.whereField("isResharedPost", isEqualTo: false)
.whereField("story", isEqualTo: false)
.whereField("createdAt", isGreaterThan: dateFilter as Any)
ref
.whereField("uid", isEqualTo: uid)
.whereField("wasViewed", isEqualTo: false)
.whereField("isResharedPost", isEqualTo: false)
.whereField("story", isEqualTo: true)
.whereField("postCreatedAt", isGreaterThan: storyFilter as Any)
ref.getDocuments { (snapshot, err) in
在尝试弄清楚如何处理在何处以及如何涉及订单和限制之前,我收到错误无效或权限不足
如果无法合并,我会将它们分成两个单独的查询,这两个查询将按顺序调用。
最佳答案
Cloud Firestore 中的单个查询只能对单个字段执行范围过滤器( >=
、 <=
等)。因为您似乎想同时过滤 createdAt
和 postCreatedAt
,这是不可能的。
另请参阅:
- 我对Firestore multiple range query的回答
Firebase documentation on queries ,其中包含以下语句:
You can only perform range comparisons (<, <=, >, >=) on a single field
关于ios - 具有顺序和限制的 Firestore 复合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947567/