【问题标题】:How to do a firestore query in chronological order on creation如何在创建时按时间顺序进行 Firestore 查询
【发布时间】:2018-05-31 09:12:03
【问题描述】:

我建立了一个集合并按顺序添加了一些文档(相隔几秒钟)。 firestore 自动生成每个 doc.id。

在文档中它说每个 doc.id 密钥由时间戳部分和随机部分组成(大概是为了确保没有密钥冲突)。 编辑:我在一篇不相关的博客文章中读到了这篇文章,所以我删除了这篇文章以避免混淆。

Since 如果键包含一些(隐藏的)年表,是否可以基于此键进行 Firestore 查询,从而按时间升序或降序获得结果集?p>

【问题讨论】:

  • firebaser here “在文档中它说每个 doc.id 密钥都由时间戳部分和随机部分组成” 这不应该出现在 Firestore 文档中的任何位置。你能指出你在哪里找到它,以便我们修复它吗?
  • 我的笔记有点零散,但我可能读错了(push id 不是 firestore id,所以不确定这是我唯一读到的东西)firebase.googleblog.com/2015/02/…
  • 这是一篇关于 Firebase 实时数据库的博文,它确实使用时间戳作为其自动生成的密钥的一部分。它明确不适用于 Cloud Firestore,它(正如 Grimthorr 回答的那样)记录了如果您希望能够按时间顺序获得结果,则需要添加自己的时间戳。
  • @FrankvanPuffelen 感谢您的澄清。我已经编辑了问题以避免混淆。

标签: firebase google-cloud-firestore


【解决方案1】:

很遗憾,Cloud Firestore 自动生成的 ID 不提供任何自动排序,并且不能依赖于按时间顺序排列。要按时间顺序排列文档,您应该在文档中添加自己的时间戳字段。

来自Firestore add a document documentation

重要提示:与 Firebase 实时数据库中的“推送 ID”不同,Cloud Firestore 自动生成的 ID 不提供任何自动排序。如果您希望能够按创建日期对文档进行排序,则应将时间戳作为字段存储在文档中。

【讨论】:

    【解决方案2】:

    使用这个 firebase 函数将我缺少的“createdAt”字段添加到我在 firestore 上的所有用户文档中。它一次修复 450 个文档(有 500 个硬性限制)并返回其 ID 列表。

    const admin = require('firebase-admin');  
    admin.initializeApp(/*.....*/);
    let db = admin.firestore();
    
    exports.fixUserBase = functions.https.onCall((data, context) => {
          let usersRef = db.collection('users');
          const batch = db.batch();
          let newCount = 0;
          var changed = [];
          return usersRef.get().then(snapshot => {
            if (snapshot.empty) {
              console.log('No matching documents.');
              return [];
            }  
            else {
              console.log('Received ' + snapshot.length + 'user documents.');
            }
            snapshot.forEach(docDataOrg => {
              if (newCount>450){
                if (newCount==451) console.log('Stoping at 450');
                newCount += 1;
              } else {
                var docData = docDataOrg.data();
                var userID = docDataOrg.id;
    
                var createdAt = docDataOrg["createTime"];
                if (!(docData["createdAt"]!=null)){  
                  console.log('updateing createdAt for ' + docData["email"]);
                  batch.update(usersRef.doc(userID), {"createdAt":createdAt.seconds})
    //I prefer seconds to timestamp, remove the '.seconds' if you prefer otherwise
                  newCount += 1;
                  changed.push(userID);
                }
              }
            });
            console.log('returning ' + changed);
            return batch.commit().then(function(){
              return changed;
            }); 
          });
        });
    

    这段代码可以为我节省一些时间,很高兴分享。

    【讨论】:

      猜你喜欢
      • 2012-07-26
      • 2018-03-28
      • 2018-07-07
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多