在 Firestore 中创建分页时间顺序查询

joe*_*joe 5 javascript firebase google-cloud-firestore

希望这里有一个使用 Firestore 查询的相对简单的问题

我试图从本质上创建一个新闻提要,从最旧的内容中排序最新的内容。这部分很简单,我使用:

var first = db.collection("feeds/0/active").orderBy("timestamp", "desc").limit(3);
Run Code Online (Sandbox Code Playgroud)

它检索新闻提要中的 3 个最新条目。我当时的想法是在下一个查询中,下拉提要中的下 3 个项目。因此,如果我们按年龄分类,就项目的新旧程度而言,集合中的 4、5、6 名。

为此,我获取查询一中的最后一项,并使用该节点的时间戳作为查询 2 中的起始值:

  var first = db.collection("feeds/0/active").orderBy("timestamp", "desc").limit(3);

      first.get().then(function (documentSnapshots) {
      // Get the last visible document
      var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1];


      var next = db.collection("feeds/0/active").orderBy("timestamp", "desc").startAt(lastVisible.data().timestamp).limit(3);
      next.get().then(function(docSn){
        console.log("SECOND QUERY!")
        docSn.forEach(function(doc) {
          console.log(doc.data().message)
        })
      })
Run Code Online (Sandbox Code Playgroud)

此代码的结果返回与第一个查询返回的结果相同,节点 1、2、3 尽管试图告诉第二个查询从节点 3 开始

我也尝试传入一个 javascript 对象:

  var datevalue = Date.parse(lastVisible.data().timestamp)    
  var next = db.collection("feeds/0/active").orderBy("timestamp", "desc").startAt(datevalue).limit(3);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这也不起作用。我还尝试传入整个快照项,并收到错误消息“来自 JS 的错误调用:字段大小不同。[[9,38,38,38],[0,0,1,0] 等..”

不知道从哪里开始,因为我已经阅读了文档和任何示例,我可以找到但似乎无法弄清楚。我能想到的实现这一点的唯一另一种方法是使用云函数在创建时为每个节点编号..但这感觉很糟糕

任何帮助将是巨大的!谢谢

Bry*_*oth 0

您是否检查返回的整个列表?或者,只是第一个节点?

如果您使用startAt,那么第二个列表中的第一个节点将是第一个列表中的最后一个节点(文档)。我建议使用startAfter文档)。

例子:

    var db = firebase.firestore()
    var query = db.collection('feeds/0/active').orderBy('timestamp', 'desc').limit(3)
    query.get().then((firstSnapshot) => {
      var first3 = snapshot.docs
      query.startAfter(first3[2]).get().then((nextSnapshot) => {
        var next3 = snapshot.docs
      })
    })
Run Code Online (Sandbox Code Playgroud)