javascript - 在 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 中获取最后一项,并使用该节点的时间戳作为我在查询 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], 等等。”

我真的不知道从哪里开始,因为我已经通读了文档和任何示例,我可以找到但似乎无法弄清楚。我能想到的实现它的唯一其他方法是使用 Cloud Function 在创建时对每个节点进行编号。但这感觉很老套

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

最佳答案

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

启动 Firestore 并设置 TimestampsInSnapshots 设置的示例:

   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

关于javascript - 在 Firestore 中创建分页时间查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46781561/

相关文章:

javascript - 关闭 Bootstrap 警报

javascript - 在 Javascript 中解析 JSON

php - 应用程序在前台时不调用 Firebase onMessageReceived

swift - 按时间戳对 Firebase 查询进行分页

javascript - 我正在尝试查询 firestore 中的时间戳

JavaScript 不使用 x.y,其中 y 是变量的名称

javascript - 在客户端 javascript 文件中使用 JSON 数据

Firebase 在 M1 Mac 上损坏

google-cloud-firestore - 是否有读取集合中所有文档的规则功能?

javascript - Firestore Cloud Functions 结果不一致