Firestore订单依据

时间:2018-03-10 19:39:43

标签: swift google-cloud-firestore

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

我能够从日期字段中查询和订购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()
                })

1 个答案:

答案 0 :(得分:0)

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

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

  1. 使用 .order(by: "sentDate",Descing: 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]。