我正在尝试从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>`
);
});
});
我已将数据库中的索引应用为:
答案 0 :(得分:1)
Firebase数据库查询只能对每个子项下已知路径的属性进行排序/过滤。
您的结构是/threads/$threadid/messages/$messageid
。您不能跨所有线程运行查询,然后过滤每个消息的时间。您将需要加载所有消息并过滤客户端/云功能,或者您必须更改数据结构以满足您的需求。
有关详情,请参阅我的回答:Firebase Query Double Nested