【问题标题】:Firestore: startAt in geohash query for infinite scrolll in React NativeFirestore:react Native 中无限滚动的 geohash 查询中的 startAt
【发布时间】:2020-12-07 21:47:21
【问题描述】:

我正在创建一个应用程序,我想从用户源中获取最近的用户帖子。因此,用户可以阅读他所在位置附近的所有帖子。所以我正在使用这段代码:

let query =  dbRef
            .orderBy('location.geohash')
            .where("location.geohash", ">=", range.lower)
            .where("location.geohash", "<=", range.upper)
            .limit(9)

问题是当我想添加“.startAt(somefield)”时。无法检索更多数据,因为 geohashes 不是唯一的。实际上,如果我想用 .orderBy(timestamp) 订购这个 fetch,我也会遇到同样的问题(它不起作用)

所以我的问题是。实际上有一种方法可以做到这一点。或者也许我必须选择转移到像 mysql 这样的关系数据库?

【问题讨论】:

  • 所有查询都以对文档 ID 的 orderBy 调用隐式结束。如果您将DocumentSnapshot 传递给startAt(),则它包含查找起始文档所需的所有信息,即使location.geohash 值不是唯一的。
  • 您好,感谢您的回答,我在 youtube 上观看了您关于此的视频。好的,但是当我添加 startAt("geohashhere") 我只得到一个结果然后崩溃。检查此图像。请prnt.sc/u1r8p8。当我只使用 dbRef.orderBy("timestamp").limit(9).startAt(" a date here") 时,这不会发生。这里效果很好
  • 如前所述:您需要传递 DocumentSnapshot,或者至少传递 geohash 和文档 ID,以便使用该 ID 消除歧义。
  • 原谅我的无知,但我理解你说的是这样做:i.imgur.com/0ueDBLT.png但我得到了重复的数据
  • 好的,我用异步函数解决了在获取查询之前等待响应。非常感谢您的帮助

标签: javascript firebase react-native google-cloud-firestore


【解决方案1】:

如果有人想知道我是如何解决的。我是这样做的(感谢 Frank van Puffelen 的指示)

我创建了一个 newData 变量来保存 documentSnapshot,然后我使用最后一个文档 ID 对 firebase 进行了异步获取查询以获取快照。

let newData

        if(docId)  {
            await dbRef.doc(docId).get().then(documentSnapshot => {
                if (documentSnapshot) {
                    newData = documentSnapshot
                }
              });
        } 
    

如果 newData 不为空,我将 startAfter 和 newData 变量添加到查询中

let query =  dbRef
                .where("location.geohash", ">=", range.lower)
                .where("location.geohash", "<=", range.upper)
                .orderBy('location.geohash')
                
                if(newData) {
                    query = query.startAfter(newData)
                }
                
            query = query.limit(9)
           
            query.get()
            .then(res => {
                    if (res) { 
                        res.docs.map(doc => { return doc.data() }) 
                    }
            })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多