2017-10-17 3 views
3

J'espère qu'une question relativement simple ici avec l'utilisation de Firestore querysCréation d'une requête chronologique dans Firestore, peut-être Bug?

J'essaie de créer essentiellement un fil de nouvelles, en triant le contenu le plus récent à partir du contenu le plus ancien. Cette partie est assez facile, j'utilise:

var first = db.collection("feeds/0/active").orderBy("timestamp", "desc").limit(3); 

Qui récupère les 3 nouvelles entrées dans le fil de nouvelles. Mon idée est alors dans la prochaine requête, pour tirer vers le bas les 3 prochains éléments dans le flux. Donc, si nous allons par l'âge, 4,5,6 dans la collection en termes de la façon dont les nouveaux articles sont.

Pour ce faire, je prends le dernier élément dans la requête un, et utilisez l'horodatage de ce noeud comme mon départ à la valeur dans la requête 2:

var first = db.collection("feeds/0/active").orderBy("timestamp", "desc").limit(3); 

     first.get().then(function (documentSnapshots) { 
     // Get the last visible document 
     var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1]; 


     var next = db.collection("feeds/0/active").orderBy("timestamp", "desc").startAt(lastVisible.data().timestamp).limit(3); 
     next.get().then(function(docSn){ 
     console.log("SECOND QUERY!") 
     docSn.forEach(function(doc) { 
      console.log(doc.data().message) 
     }) 
     }) 

Le résultat de ce code renvoie le même que les premiers retours de la requête , les nœuds 1, 2, 3 en dépit d'essayer de dire la deuxième requête pour commencer à node3

J'ai aussi essayé passer dans un objet javascript à la place:

var datevalue = Date.parse(lastVisible.data().timestamp)  
    var next = db.collection("feeds/0/active").orderBy("timestamp", "desc").startAt(datevalue).limit(3); 

qui a également Malheureusement, les nouvea n'a pas fonctionné. J'ai également essayé de passer dans l'ensemble de l'élément d'instantané, et j'ai obtenu l'erreur "Appels malforormés de JS: les tailles de champs sont différentes: [[9,38,38,38], [0,0,1,0], etc .. "

Pas vraiment idée par où commencer avec cela comme j'ai lu les documents et tous les exemples et je pourrais trouver et ne peux pas le comprendre. La seule autre façon que je peux penser à mettre en œuvre ceci est en utilisant une fonction Cloud pour numéroter chaque nœud lors de la création .. mais cela semble hacky

Toute aide serait énorme! Merci

+0

toute idée qui que ce soit? – joe

Répondre

0

Vérifiez-vous la liste complète retournée? Ou, juste le premier noeud? Si vous utilisez startAt, le premier nœud de la deuxième liste sera le dernier nœud de la première liste (docs). Je suggère d'utiliser startAfter (docs).

Exemple:

var db = firebase.firestore() 
    var query = db.collection('feeds/0/active').orderBy('timestamp', 'desc').limit(3) 
    query.get().then((firstSnapshot) => { 
     var first3 = snapshot.docs 
     query.startAfter(first3[2]).get().then((nextSnapshot) => { 
     var next3 = snapshot.docs 
     }) 
    })