【问题标题】:Firestore order by and limitFirestore 排序依据和限制
【发布时间】:2018-08-19 04:13:33
【问题描述】:

我正在我的应用程序中编写一个简单的聊天功能。鉴于某些用户在对话中会有多条消息,我需要提供反向分页,以便他们可以在滚动时加载以前的消息。在模型方面,每条消息都有一个时间戳(一个时间间隔),以便于查询。

我可以从日期字段查询和订购 desc,但是...第二个我将响应限制为 X 个项目.. 不知何故,日期字段被省略了,我得到了集合中的前 5 个,不是我想要按日期订购的 5 个。我该如何解决这个问题?

示例

消息一:1

消息二:2

消息三:3

消息四:4

当我订购 desc 时,我得到了正确的列表 [1,2,3,4,5]。当我限制(2)时,它给了我 [1,2] 但我真正想要的是 [3, 4]。

我遗漏了一些明显的东西?

更新:

集合:“对话”。子集合“消息”。

集合 ID 是通过聚合两个用户 ID 完成的,因此更容易查询 2 个用户的对话。

db.collection("conversations")
                .document(identifier)
                .collection("messages")
                .order(by: "sentDate", descending: false)
                .limit(to: 5)
                .addSnapshotListener({ snapshot, error in
                    guard let document = snapshot else { return }
                    let messages = document.documents.map {
                        return Message.fromJSON($0.data())
                    }

                    observable.onNext(messages as! [Message])
                    observable.onCompleted()
                })

【问题讨论】:

  • 请在您的问题中包含您的查询/查询的实际代码。查看您正在查询的集合/文档也将有所帮助。
  • 我更新了我原来的问题,谢谢@FrankvanPuffelen
  • 我想我想要的是 limitToLast ?事物类型
  • 实时数据库的limitToLast() 没有等效项。相反,您必须颠倒排序顺序,然后重新颠倒客户端中的项目。见stackoverflow.com/questions/48342525/…
  • @FrankvanPuffelen 但这不会破坏分页吗?

标签: swift google-cloud-firestore


【解决方案1】:

如果您在 .order(by: "sentDate", descending: false) 期间得到 [1,2,3,4],则

和 [1,2] 使用时 .order(by: "sentDate", descending: false).limit(to: 2), 那么您可以执行以下操作:

  1. 使用.order(by: "sentDate", descending: true) 得到[4,3,2,1]
  2. 然后使用.limit(to: 2)得到[4,3]
  3. 最后在映射之前使用 .reverse()
(ie. let messages = document.documents.reverse().map line in your code)

你会得到 [3,4]。

【讨论】:

    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 2018-11-08
    • 2019-10-17
    • 2020-01-14
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多