Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Firestore中创建分页的按时间顺序的查询_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

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

Javascript 在Firestore中创建分页的按时间顺序的查询,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,希望这里有一个使用Firestore查询的相对简单的问题 我试图创建一个新闻提要,将最新内容与最旧内容进行排序。这部分很简单,我使用: var first = db.collection("feeds/0/active").orderBy("timestamp", "desc").limit(3); 它检索新闻提要中的3个最新条目。然后我的想法是在下一个查询中,下拉提要中接下来的3项。因此,如果我们按年龄,4,5,6在集合中的项目是如何新的 为此,我获取查询1中的最后一项,并使用该节点的时间戳

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

我试图创建一个新闻提要,将最新内容与最旧内容进行排序。这部分很简单,我使用:

var first = db.collection("feeds/0/active").orderBy("timestamp", "desc").limit(3);
它检索新闻提要中的3个最新条目。然后我的想法是在下一个查询中,下拉提要中接下来的3项。因此,如果我们按年龄,4,5,6在集合中的项目是如何新的

为此,我获取查询1中的最后一项,并使用该节点的时间戳作为查询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)
        })
      })
此代码的结果返回与第一个查询相同的结果,即节点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);
不幸的是,这也不起作用。 我还尝试传入整个快照项,但出现了错误 “来自JS的错误调用:字段大小不同。 [[9,38,38,38],[0,0,1,0], 等等……”

我不知道从哪里开始,因为我已经阅读了文档和任何示例,我可以找到,但似乎无法理解。我能想到的实现这一点的唯一其他方法是在创建时使用云函数对每个节点进行编号……但这感觉有点粗糙


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

您是否检查返回的整个列表?还是仅检查第一个节点

如果使用
startAt
,则第二个列表中的第一个节点将是第一个列表()中的最后一个节点。我建议使用
startaafter
()

例如:

    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
      })
    })

我有一个名为“books”的集合,其中有一个名为“created”的字段,类型为Timestamp。这不是字符串。这不是日期。请参阅。您需要在设置中指定要在时间戳字段中使用新的时间戳类型而不是日期。(请参阅)

启动firestore并设置时间戳快照设置的示例:

   var firebaseApp = firebase.initializeApp({
        apiKey: [APIKEY],
        authDomain: [FIREBASEAPPDOMAIN],
        projectId: [PROJECTID]
   });

   var firestore = firebase.firestore();
   var settings = { timestampsInSnapshots: true }; // force Timestamp object instead of Date

   firestore.settings(settings);
完成后,我运行了下面的代码,得到了预期的结果。第一个查询返回三个结果。最新的第一个,最新的最后一个。 第二个查询返回接下来的三项

var first = db.collection('books').orderBy("created", "desc").limit(3);
console.log("FIRST QUERY!")
first.get().then(function(documentSnapshots) {    
    documentSnapshots.forEach(function (doc) {
        console.log(doc.data().created.toMillis())
    });
    // Get the last visible document
    var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length - 1];

    var next = db.collection('books').orderBy("created", "desc")
         .startAfter(lastVisible.data().created).limit(3);
    next.get().then(function (docSn) {
        console.log("SECOND QUERY!")
        docSn.forEach(function (doc) {
            console.log(doc.data().created.toMillis())
        });
    });
});
从上述代码中选择控制台:

FIRST QUERY!
1540573716371
1540573676652
1540573668643

SECOND QUERY!
1540573658893
1540573536420
1540536647891

有人知道吗?你解决了吗?我现在有完全相同的问题。如何获得下三个查询?@Ajay Malik,到目前为止你试图获得下三个查询是什么?事实上,我已经解决了。非常感谢上述解决方案。