2017-10-17 1 views
1

J'ai cette liste: a b c d e f g h i j. Je veux obtenir 3 éléments de la liste autour d'un élément sélectionné. Si j'ai sélectionné e la liste des résultats devrait être d e f, si j'ai sélectionné f les résultats devraient être e f g et ainsi de suite.Comment faire de la pagination dans Google Firestore?

J'ai fait cet exemple:

console.clear() 
var pag = dbFirestore.collection("pagination") 
pag.doc("a").set({parent:"vowels"}) 
pag.doc("e").set({parent:"vowels"}) 
pag.doc("i").set({parent:"vowels"}) 
pag.doc("o").set({parent:"vowels"}) 
pag.doc("u").set({parent:"vowels"}) 
pag.doc("y").set({parent:"vowels"}) 
pag.doc("b").set({parent:"consonants"}) 
pag.doc("c").set({parent:"consonants"}) 
pag.doc("d").set({parent:"consonants"}) 
pag.doc("f").set({parent:"consonants"}) 
pag.doc("g").set({parent:"consonants"}) 
pag.doc("h").set({parent:"consonants"}) 
pag.doc("j").set({parent:"consonants"}) 
pag.doc("k").set({parent:"consonants"}) 
pag.doc("l").set({parent:"consonants"}) 
pag.doc("m").set({parent:"consonants"}) 
pag.doc("n").set({parent:"consonants"}) 
pag.doc("p").set({parent:"consonants"}) 
pag.doc("q").set({parent:"consonants"}) 
pag.doc("r").set({parent:"consonants"}) 
pag.doc("s").set({parent:"consonants"}) 
pag.doc("t").set({parent:"consonants"}) 
pag.doc("v").set({parent:"consonants"}) 
pag.doc("w").set({parent:"consonants"}) 
pag.doc("x").set({parent:"consonants"}) 
var siblings = ref => { 
    var out = [] 
    return pag.orderBy("parent").endAt(ref).limit(3).get().then(snap=>{ 
     snap.forEach(doc=>out.push(doc.id)) 
     return 
    }).then(()=>{ 
     return pag.orderBy("parent").startAfter(ref).limit(2).get().then(snap=>{ 
     snap.forEach(doc=>out.push(doc.id)) 
     return out 
     }) 
    }) 
} 
siblings(pag.doc("m")).then(out=>{ 
    console.log(out) 
}).catch(e=>console.error(e)) 

Avec sibling("m").then(out=>console.log(out)) dans out je devrais avoir k l m n p, ils ont tous parent:"consonants", k l m de la première requête combinée à n p de la deuxième requête, mais je dois autre chose.

Répondre

0

Le problème réside dans la manière dont vous créez votre requête. startAt, endAt, etc fonctionnent sur les champs que vous passez à orderBy. Donc, si vous faites .orderBy("parent").startAt("foo"), vous dites "ordonner tous les documents par la valeur de doc.parent, en commençant par doc.parent == foo".

Vous devrez donc apporter quelques modifications ici. D'abord, il sera plus facile d'interroger si vous stockez la valeur de la lettre dans le document, afin que vos documents pourrait ressembler à ceci:

{ 
    "val": "a", 
    "parent": "vowels" 
} 

Et vous pouvez faire cette requête:

/** 
* ex: siblingsOf("a", "vowels"); 
*/ 
function siblingsOf(letter, parent) { 
    var out = []; 

    // Starting at the letter, read "up" three documents 
    var threeBefore = pag.where("parent", "==", parent) 
     .orderBy("val", "desc").startAt(letter).limit(3); 

    // Starting after the letter, read "down" three documents 
    var twoAfter = pag.where("parent", "==", parent) 
     .orderBy("val").startAfter(letter).limit(2); 

    return threeBefore.get().then(snap => { 
    // Add to beginning of array 
    snap.forEach(doc => out.unshift(doc.data())); 
    }).then(() => { 
    return twoAfter.get().then(snap => { 
     // Add to end of array 
     snap.forEach(doc => out.push(doc.data())); 

     return out; 
    }); 
    }); 
} 

Alors si je l'ai fait siblingsOf("j", "consonants"), je voudrais obtenir les documents pour "g", "h", "j", "k", "l".

+0

J'ai ajouté '{val: letter}' à tous les documents. 'startAfter (letter)' fonctionne comme attendu obtient 'np', mais:' pag.where ("parent", "==", "consonnes"). orderBy ("val"). endAt ("m") .limit (3) 'obtient' bcd' les 3 premières consonnes au lieu de la 'prev' kl' plus' m' –

+0

@AlinC oui vous avez raison j'ai fait une erreur. Dans les genres qui utilisent conjointement 'endAt' et' limit', ce n'est pas une bonne idée, car les résultats de la requête se termineront à la plus forte de ces contraintes. Laissez-moi mettre à jour. –

+0

Je pense qu'il nous reste à utiliser 'unshift' au lieu de' push' pour 'threeBefore' parce que nous obtenons' m l k n p' au lieu de 'k l m n p'. Je vais essayer de me mettre à jour votre réponse. Je ne peux pas l'éditer, je dois éditer plus alors comme 6 caractères. De toute façon je sais paginer savoir, merci. –

0

Il existe une documentation sur Firebase au Pagination & Query. Nous devons utiliser les méthodes startAt() ou startAfter() pour définir le point de départ d'une requête. De même, utilisez les méthodes endAt() ou endBefore() pour définir un point de fin pour vos résultats de requête.