Ich habe dem Problem, dass ich eine Liste von Schlüssel in meiner FireBase-Datenbank habe, und ich möchte einen zufälligen Schlüssel davon abrufen, ohne alle Tasten herunterzuladen und eine in meiner eigenen App auszuwählen. Herunterladen Alle Tasten mit beispielsweise .once() ist ein großer Nein-GO, insbesondere weil ich in der Zukunft mit 10.000 Tasten enden kann. Ich möchte nicht, dass meine FireBase-Rechnungen explodieren, ich bin immer noch ein Student ohne Budget ohne Budget.

Ich habe dieses Thema bereits erforscht und gefunden Nach der Antwort auf meine Frage.

Das Problem damit ist, dass ich {limitToFirst() und auch {limitToLast() in derselben Abfrage nicht verwenden kann, sonst bekomme ich folgender Fehler:

[Unbehandeltes Versprechen Ablehnung: Error: Query.limittolast: Limit wurde bereits eingestellt (durch einen anderen Anruf, um Limitofirst oder Limittolast).]

Auch andere Leute sehen sich dem gleichen Problem wie ich und ich sehe, dass diese Frage immer viel Ansichten bekommt, sondern eher schlechte Antworten, die wie wir in dem Fall, wie ich früher veraltet bin, oder nur nicht für die Verwendung in JavaScript und reagieren.

Zusätzliche Informationen: Ich habe einen Zähler für meine Schlüssel, also weiß ich jederzeit, wie viele Tasten in meiner Datenbank gespeichert sind. Das folgende Bild zeigt meine Datenbank vollständig: Bildbeschreibung hier eingeben

Dies ist der Teil meines Codes, der den erwähnten Fehler anzeigt:

const numberOfUsers = await firebase.database().ref("usercounter").once("value").then(snapshot => {
            return(snapshot.val()); //retrieve numbers of users from "usercounter"
        });
        const randomIndex = Math.floor(Math.random() * numberOfUsers) + 1; //"generating random number, excluding 0"
        var ref = firebase.database().ref('users'); //ref to my users keys
        await ref.limitToFirst(randomIndex).limitToLast(1).once('value').then(DataSnapshot =>
            {
                //This is the query that does not work at all. 
                console.log(DataSnapshot.val())
               
            });

Inkase gibt es einen Weg, um dieses Problem zu überwinden, bitte lass es mich wissen.

0
Kubaghetto the fresh Testobun 3 Juni 2021 im 00:16

1 Antwort

Beste Antwort

Ich würde dieses Problem auf diese Weise lösen:

Erstellen Sie für jedes Listenelement einen Wert mit dem Feldnamen id oder einige andere, die Sie möchten. Es sollte eine einfache Ganzzahl sein. Idealerweise inkrementieren Sie mit der Liste. Sie können den Zähler verwenden, um den Wert zu steigern, wenn Sie ein Element hinzufügen.

Wenn Sie versuchen, ein zufälliges Element aus der Liste zu erhalten, erhalten Sie zunächst eine zufällige Ganzzahl zwischen 0 und der Gesamtzahl aller Elemente. Verwenden Sie diese Abfrage, um ein einzelnes zufälliges Element zu erhalten:

firebase.database().ref("users").orderByChild("id").startAt(randomNumber).limitToFirst(1);

Auch wenn Sie nicht mit dem randomNumber mit dem randomNumber drücken, würden Sie das nächste Element näher. Dies sollte in der Lage sein, auf jede Größe skalieren zu können.

Das meiste diffachreichste Teil wäre, um die {id inkrementativ zu entwerfen, ohne sie zu wiederholen. Ich würde für diese eine Cloud-Funktion verwenden, die es tut, wenn ein Artikel hinzugefügt wird. Sogar eine Kombination mit dem Zähler wäre interessant.

1
Tarik Huber 2 Juni 2021 im 21:52