基于子节点的日期范围的 Firebase 查询

Posted

技术标签:

【中文标题】基于子节点的日期范围的 Firebase 查询【英文标题】:Firebase Query on Date Range on basis of Child Node 【发布时间】:2018-03-02 14:23:08 【问题描述】:

我正在尝试根据 Firebase 数据库中的一些数据生成每周报告,并为此使用 Firebase 云功能。 时间戳实际上存在于子节点中。但是,我无法获取任何数据。

我的数据库结构如下:

 
   "threads" : 
      "228440-1704-4bba-87d7-27327" : 
         "messages" : 
           "8c98a76c-4456-4326-8e18-6d036b40bfa4" : 
              "time" : 1519997400,
              "payload": "someData"
            , 
            "898376c-4456-4326-8e18-6deb4wr0bfa4" : 
              "time" : 1517174415302,
              "payload": "someData"
             
          ,
      "details" : 
        "created_At": 1514134435602 
        
      

根据详细节点获取数据: 我正在尝试获取我的日期范围内存在threads/details/created_at 的线程(比如上周)。

根据消息节点获取数据: 除此之外,在另一个查询中,我想获取上周的所有消息(在不同线程中)。我想即使在这种情况下我也必须通过以下方式获取线程:

//fetch threads where message.time exists in last week

我正在使用 Firebase 云函数,我的代码如下:

exports.generateReportFromThreads = functions.https.onRequest((req, res) => 

    var ref = admin.database().ref('threads');
    var startingTime = new Date('Mon, 25 Dec 1995 13:30:00 GMT').getUnixTime();
    var currentDate = new Date('Fri, 2 Mar 2018 13:30:00 GMT').getUnixTime();

    return ref.orderByChild('details/created_at').startAt(startingTime).endAt(currentDate).once("value", (threadSnapshot) => 

      var numberOfThreads = threadSnapshot.numChildren()
      var totalMessages = 0

       threadSnapshot.forEach((snapshot) => 

        var ref = snapshot.child('messages')
         var messagesPerThread = ref.numChildren()
         totalMessages = totalMessages + messagesPerThread


      res.send(`
          <!doctype html>
          <html>
              <body>
               <p>Total number of threads = $numberOfThreads</p>
               <p>Total messages = $totalMessages</p>
              </body>
          </html>`
      );
   );
);

我在我的数据库中应用了以下索引:

【问题讨论】:

因为这个orderByChild('details/created_at').startAt(startingTime).endAt(currentDate)不存在 @PeterHaddad,感谢您的回复。只是我正在测试并试图以某种方式获取一些东西。我不知道该怎么做。可以指导一下吗? 【参考方案1】:

Firebase 数据库查询只能对位于每个子项下的已知路径的属性进行排序/过滤。

你的结构是/threads/$threadid/messages/$messageid。您不能在所有线程上运行查询,然后过滤每条消息的时间。您要么必须加载所有消息并在客户端/在云函数中过滤,要么必须更改数据结构以满足您的需求。

有关此的更多信息,请在此处查看我的答案:Firebase Query Double Nested

【讨论】:

详细节点呢? /threads/$threadid/detail/createdAt? @Frank van Puffelen 或者,有没有办法使用云功能在 Firebase DB 上执行分页?? 您确实可以对每个线程的创建数据进行排序,因为该值位于每个子节点下的固定路径中。请注意,这里没有关于 Cloud Functions 的任何具体内容。您正在使用常规 Firebase Admin SDK 访问数据库,并且与该 SDK 的其他用户具有完全相同的能力和限制,并且与使用 Web SDK 的开发人员的行为基本相同。 有道理。但是,恐怕我仍然不确定如何根据创建日期对每个线程进行排序?意思是,我将如何在代码中做到这一点?我肯定在我的问题中提到的查询中做错了什么。如何解决? 该查询对我来说看起来不错。你看到什么行为?您期望看到什么行为?通常通过添加一些日志记录、显示其输出并告诉您的预期来描述这一点是最简单的。

以上是关于基于子节点的日期范围的 Firebase 查询的主要内容,如果未能解决你的问题,请参考以下文章

根据子数据前面的6位搜索firebase实时数据库,我想查询两个数字(日期)之间的数据

从所有子节点的子 id firebase 获取数据

CocosCreator核心概念里的基础点

SqlServer 中查询子节对应的上级自定义函数

给元素添加子节点,元素子节点数改变,反过来影响上方调用其值的异步任务回调函数(如click。load,定时器等

给元素添加子节点,元素子节点数改变,反过来影响上方调用其值的异步任务回调函数(如click。load,定时器等