web-dev-qa-db-fra.com

firebase -> ordre des dates inversé

Je suis actuellement en train de créer une application utilisant Firebase.

C'est l'un de ces babillards électroniques que l'on peut voir n'importe où sur le Web.

Mais il y avait un problème.

C'est une question de tri par date.

Je veux commencer par regarder la date récente, mais je ne vois toujours que les données que j'ai créées en premier. 

postRef.orderByChild('createData').startAt(reverseDate).limitToFirst(1).on('child_added',(data)=>{
    console.log(data.val().name + data.val().createData);
})

résultat -> hello1496941142093

Mon arbre de base de feu  enter image description here

Mon code est le même que ci-dessus.

Comment puis-je vérifier mes publications récentes en premier?

Comment commander l'inverse de la base de données firebase?

6

La base de données Firebase renverra toujours les résultats par ordre croissant. Il n'y a aucun moyen de les inverser.

Il existe deux solutions de contournement courantes pour cela:

  1. Laissez la base de données effectuer le filtrage, puis inversez les résultats côté client.
  2. Ajoutez une valeur inversée à la base de données et utilisez-la pour l'interrogation.

Ces options ont déjà été abordées à plusieurs reprises. Donc, au lieu de répéter, je vais vous donner une liste de réponses précédentes:

14

Vous pouvez simplement créer une fonction pour inverser l'objet puis le traverser.

function reverseObject(object) {
    var newObject = {};
    var keys = [];

    for (var key in object) {
        keys.Push(key);
    }

    for (var i = keys.length - 1; i >= 0; i--) {
        var value = object[keys[i]];
        newObject[keys[i]]= value;
    }       

    return newObject;
}
2
Suraj Kumar

J'ai fini de changer la façon dont je crée ma liste sur la partie frontale.

était

posts.add(post);

changé en

posts.insert(0, post);
0
kashlo

Voici comment je l'ai résolu: D'abord, j'ai effectué une requête dans mon service dans laquelle je filtre par date en millisecondes:

 getImages (): Observable<Image[]> {
this.imageCollection = this.asf.collection<Image>('/images', ref => ref.orderBy('time').startAt(1528445969388).endAt(9999999999999));
this.images = this.imageCollection.snapshotChanges().pipe(
  map(actions => actions.map(a => {
    const data = a.payload.doc.data() as Image;
    const id = a.payload.doc.id;
    return { id, ...data };
  }))
);
return this.images;

}

Ensuite, pour obtenir la date la plus récente, j'ai d'abord ajouté ceci à mon composant, où j'appelle la méthode depuis mon service: 

let date = new Date;
let time = 9999999999999 - date.getTime();
console.log(time);

Je passe le temps laissé comme la date. Puisqu'une date plus récente sera un nombre plus grand à déduire du 9999999999999, la date la plus récente apparaîtra en premier dans ma requête dans mon service.

J'espère que cela a résolu le problème pour vous

0
Wolfyr