如何在创建时按时间顺序执行firestore查询

时间:2018-05-31 09:12:03

标签: firebase google-cloud-firestore

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

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

由于如果密钥包含一些(隐藏)年表,是否可以根据此密钥执行firestore查询,从而按升序或降序按时间顺序获取结果集?

2 个答案:

答案 0 :(得分:3)

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

来自Firestore add a document documentation

  

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

答案 1 :(得分:0)

使用此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;
        }); 
      });
    });

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