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

时间:2018-03-02 14:23:09

标签: node.js firebase firebase-realtime-database google-cloud-functions

我正在尝试从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>`
      );
   });
});

我已将数据库中的索引应用为:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

您的结构是/threads/$threadid/messages/$messageid。您不能跨所有线程运行查询,然后过滤每个消息的时间。您将需要加载所有消息并过滤客户端/云功能,或者您必须更改数据结构以满足您的需求。

有关详情,请参阅我的回答:Firebase Query Double Nested