2017-07-09 5 views
0

Ich benutze Firebase-Funktionen für meine Alexa-Fähigkeit. Dies funktioniert wie erwartet, aber meine Daten in der Datenbank sind speziell und manchmal kann die Abfrage keinen Wert zurückgeben.Firebase-Datenbank ohne Ergebnis

Meine Schlüssel sind von 0101 bis 1231 (MMDD) und wenn ich hinter dem höchsten Schlüssel abfrage, bekomme ich keinen Rückruf, weil Firebase keine Daten hat.

Wie kann ich die Abfrage einstellen, dass ich in diesem Fall das erste> = "0101" finde?

Die zur Zeit nennen, ist

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

Meine Datenbankstruktur

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

Meine Alexa Geschick den nächsten Geburtstag nennen sollte, und es wird nur noch bis 09. November und nach dem 01. Januar arbeiten, weil ich Ich weiß nicht, wie ich die Daten abfragen soll. Oder kann ich meine Daten besser strukturieren, um den nächsten Geburtstag zu finden?

+0

Sie werden wahrscheinlich von der "Array-Konvertierung" der Firebase SDKs überrascht. Gibt es eine Möglichkeit, dass Sie die Daten ändern und die Schlüssel voranstellen können (z. B. "day_0101"). Das wird den Zwang verhindern und (wenn das der Grund für das Problem war) das Problem beheben. –

+0

Sicher kann ich die Schlüssel ändern, aber wie wird das Problem "keine Daten gefunden" behoben? Mein letzter Schlüssel ist "1109" und wenn ich die obige Abfrage mit "key = '1110'" anrufe, bekomme ich keine Werte (gerade jetzt). – mars3142

+0

Können Sie Ihre Frage bearbeiten, um den von Ihnen abgefragten JSON anzuzeigen (als Text, keine Screenshots)? Sie können dies erreichen, indem Sie in Ihrer [Firebase-Datenbankkonsole] (https://console.firebase.google.com/project/_/database/data) auf den Link "JSON exportieren" klicken. –

Antwort

1

Ich denke, du suchst: Woher weiß ich, dass es keine Geburtstage gibt, die zu meiner Suchanfrage passen? In diesem Fall müssen Sie auf das Ereignis value warten. Wenn Sie das mit einer once() anfügen, wird es sofort ausgelöst, wenn Sie die Abfrage anhängen, unabhängig davon, ob Ergebnisse vorliegen oder nicht.

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); 
     }); 
    } 
    }) 

Der exists() feststellt, dass es keine Ergebnisse waren die Abfrage entsprechen. Die forEach() Schleife in der else ist das Ergebnis der Verwendung von value mit einer Abfrage. Wenn Sie eine Abfrage für die Firebase-Datenbank ausführen, werden möglicherweise mehrere Ergebnisse angezeigt. Der Snapshot enthält also eine Liste dieser Ergebnisse. Selbst wenn nur ein Ergebnis vorhanden ist, enthält der Snapshot eine Liste mit einem Ergebnis.

+1

Ich glaube, OP wollte einen Weg, um immer ein Ergebnis zu erhalten, indem man einen Wrap-Around/Round-Robin-Typ von Abfrage verwendet. Z.B. bei der Abfrage des nächsten Geburtstages nach dem 11. November ('1111') sollte es mit dem Geburtstag am 11. Januar (' 0111') statt "ohne Geburtstage" kommen. Wenn mindestens ein Geburtstag in der Liste ist, sollte es nie ein "keine Geburtstage" -Ergebnis geben. – mbirth

+0

Ja, das war die Lösung, nach der ich gesucht habe. Jetzt kann ich auch nach "nächstes Jahr" suchen, wenn Strom keine Ergebnisse hat. Ich weiß, dass ich immer auf deine Antworten zählen kann. Vielen Dank. – mars3142

+0

Danke für die Klärung Markus! Es gibt keine Möglichkeit, die Suche automatisch zu umbrechen. In der Tat können Sie mithilfe eines "Wert" -Ereignisses feststellen, dass Sie eine zweite Abfrage auslösen müssen. –

Verwandte Themen