【问题标题】:Firestore how to combine orderBy desc with startAfter(null)Firestore如何将orderBy desc与startAfter(null)结合起来
【发布时间】:2019-07-17 18:29:27
【问题描述】:

我一直在寻找这个,但没有找到原因。

基本上这会返回集合中的文档数组。

this.db.collection('people', ref => {
    return ref.orderBy(name, 'asc')
              .startAfter(null)
              .limit(10)
})...

这会返回一个空数组。

this.db.collection('people', ref => {
    return ref.orderBy(name, 'desc')
              .startAfter(null)
              .limit(10)
})...

唯一的区别是 orderBy 设置为 'desc'。有人可以解释为什么会发生这种情况以及解决方法吗?提前致谢!

【问题讨论】:

    标签: javascript firebase google-cloud-firestore angularfire2


    【解决方案1】:

    我相信问题是startAfter(null)。当您按升序排序时,空文档首先出现,然后是非空文档。具体顺序见Firebase documentation on the ordering of value types

    当您按降序排序时,所有空文档都排在最后,因此空文档之后没有任何内容可供查询返回。

    我建议删除startAfter(null),直到你有它的价值。

    【讨论】:

    • 如果我删除 startAfter 我的 snapshotChanges 出于某种原因会触发两次。不知道为什么
    • 写操作后是否触发了两次?本地写入会触发两次,一次是在本地写入,然后是在写入提交到数据库时再次触发。请参阅latency compensation 上的文档。
    • 不写只是读。当我对集合应用 where 查询时,SnapshotChanges 会触发两次。看起来它首先发出一些缓存值,然后是来自服务器的完整响应。
    • 希望这个答案有所帮助。您还有其他关于 SnapshotChanges 的问题吗?如果是这样,请使用显示行为的 sn-p 发布另一个问题。
    【解决方案2】:

    如果有人对我的解决方案感兴趣,请向上箭头:

    var lastDocumentSnapshot : DocumentSnapshot? = null;
    if (url != null){
        val query = this.getLastDocumentSnapshotAsync(url).await()
         if (!query.isEmpty){
            lastDocumentSnapshot = query.documents.distinct().first()
         }
    }
    
    val query = firebaseDb.collection("urls")
        .orderBy("name", sortDirection)
        .limit(limit)
    if (sortDirection == Query.Direction.ASCENDING)
        query.startAfter(lastDocumentSnapshot)
    else
        query.endBefore(lastDocumentSnapshot)
    
    return query.get().asDeferredAsync()
    

    不要介意代码的其他部分。如果排序是降序,基本上解决方法是使用endBefore

    【讨论】:

    • 嘿,我不明白你的代码。这对我来说没有什么意义。但是 endBefore 技巧虽然按降序排列。谢谢。
    • 在我看来,您的代码并没有直接回答所提出的问题。对于那些不熟悉该主题的人来说,他们会感到困惑。我的解决方案就像你建议的那样使用endBefore 而不是startAfter。仅此一项就应该是您的答案。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2018-12-08
    • 2012-03-17
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多