Je fais face au problème que j'ai une liste de clés dans ma base de données Firebase et que je souhaite récupérer une clé aléatoire, sans télécharger toutes les clés et en sélectionnant un dans ma propre application. Téléchargement de toutes les clés avec par exemple .once() est un grand non go, en particulier parce que je peux vous mettre fin avec 10 000 clés à l'avenir et je ne veux pas que mes factures de Firebase explosent, je suis toujours étudiant sans budget.

J'ai déjà étudié ce sujet et trouvé Réponse suivante pour ma question.

Le problème avec ceci est que je ne peux pas utiliser limitToFirst() et aussi limitToLast() dans la même requête, sinon je reçois la suite d'erreur suivante:

[Rejet de promesse non confondu: Erreur: Query.Limittolast: La limite était déjà définie (par un autre appel à limiter, Limittofirt ou Limittolast).]

De plus, d'autres personnes font face au même problème comme moi et I Generaly, on voit que cette question obtient toujours beaucoup de vues, mais plutôt de mauvaises réponses qui sont, comme le cas, dans l'affaire, je l'ai mentionnée plus tôt, ou tout simplement pas pour l'utilisation de JavaScript et de la réaction.

Informations supplémentaires: J'ai un compteur pour mes clés pour que je sache à chaque fois combien de clés stockées dans ma base de données. La photo suivante montre entièrement ma base de données: Entrez la description de l'image ici

C'est la partie de mon code qui montre l'erreur mentionnée:

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

Incase Il existe un moyen de surmonter ce problème, merci de me le faire savoir.

0
Kubaghetto the fresh Testobun 3 juin 2021 à 00:16

1 réponse

Meilleure réponse

Je résoudrais ce problème de cette façon:

Créez-vous pour chaque élément de liste une valeur avec le nom de champ id ou d'autres que vous voulez. Cela devrait être un entier simple. Avec une incrémentation de la croissance avec la liste. Vous pouvez utiliser le compteur pour augmenter la valeur chaque fois que vous ajoutez un élément.

Lorsque vous essayez d'obtenir un élément aléatoire de la liste, obtenez d'abord un entier aléatoire entre 0 et le nombre total de tous les éléments. Utilisez ensuite cette requête pour obtenir un seul élément aléatoire:

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

Même si vous n'allez pas frapper le id avec le randomNumber, vous feriez le prochain élément suivant. Cela devrait être capable d'échelle à n'importe quelle taille.

La partie la plus difficulte serait d'optiner l'incrémentation id sans les répéter. J'utiliserais pour cette fonction de nuage qui le fait quand un élément est ajouté. Même une combinaison avec le comptoir serait intéressante.

1
Tarik Huber 2 juin 2021 à 21:52