2017-07-09 48 views
0

我为我的Alexa技能使用了Firebase函数。这是按预期工作,但我在数据库中的数据是特殊的,有时候查询不能返回任何值。没有结果的Firebase数据库

我的密钥是从0101到1231(MMDD),如果我查询最高密钥后,我没有得到任何回调,因为firebase没有任何数据。

如何设置查询,我发现在这种情况下第一个> =“0101”?

当前调用是

admin.database().ref("calendar/birthday") 
.orderByKey().startAt(key).limitToFirst(1).once("child_added") 
.then(function(snapshot) { ... }) 

我的数据库结构

"calendar" : { 
    "birthday" : { 
     "0111" : { 
     ... -> 1st person 
     }, 
     ... 
     "0710" : { 
     ... -> xth person 
     }, 
     ... 
     "1109" : { 
     ... -> last person 
     } 
    } 
} 

我的Alexa的技能应该命名为下一个生日和它只会工作,直到09月和01月后,因为我不知道如何查询数据。或者我可以更好地构建我的数据来找到下一个生日?

+0

您很可能被Firebase SDK的“数组强制”所捕获。有没有一种方法可以更改数据并在键前添加(例如“day_0101”)。这将防止强制和(如果这是问题的原因)将解决问题。 –

+0

当然,我可以更改密钥,但是如何解决“找不到数据”的问题?我的最后一个键是“1109”,如果我用“key ='1110'”调用上面的查询,我将不会得到任何值(现在)。 – mars3142

+0

你可以编辑你的问题来显示你正在查询的JSON(文本,没有截图)吗?您可以通过点击[Firebase数据库控制台](https://console.firebase.google.com/project/_/database/data)中的“导出JSON”链接来获取此信息。 –

回答

1

我认为你在寻找:我怎么知道没有与我的查询匹配的生日?

在这种情况下,您需要倾听value事件。如果您使用once()附加它,则无论结果与否,在附加查询时都会立即触发。

admin.database().ref("calendar/birthday") 
    .orderByKey().startAt(key).limitToFirst(1).once("value") 
    .then(function(snapshot) { 
    if (!snapshot.exists()) { 
     console.log("There are no birthdays on or after "+key); 
    } 
    else { 
     snapshot.forEach(function(daySnapshot) { 
     console.log("There is a birthday on "+daySnapshot.key); 
     }); 
    } 
    }) 

exists()检测到没有与查询匹配的结果。 else中的forEach()循环是对查询使用value的结果。当您对Firebase数据库执行查询时,可能会有多个结果。所以快照包含了这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

+1

我相信OP希望通过使用一些环绕/循环类型的查询来获得结果。例如。当在11月11日之后查询下一个生日(1111)时,它应该在1月11日('0111')生日回来而不是“没有生日”。如果列表中至少有一个生日,则永远不会有“无生日”结果。 – mbirth

+0

是的,这是我寻找的解决方案。如果目前没有结果,现在我也可以搜索“明年”。我知道我总是可以依靠你的答案。谢谢。 – mars3142

+0

感谢您澄清Markus!没有办法自动进行搜索。但的确,使用'value'事件,你可以确定你需要触发第二个查询。 –