2017-10-17 106 views
1

我有這個清單:a b c d e f g h i j。我想從列表中選取3個項目。如果我選擇了e,結果列表應該是d e f,如果我選擇了f,結果應該是e f g等等。在out如何在Google Firestore中進行分頁?

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)) 

隨着sibling("m").then(out=>console.log(out))我應該有k l m n p,他們都有parent:"consonants"k l m第一個查詢與n p從第二查詢相結合,但我有別的東西:

我做了這個例子。

回答

0

問題出在您形成查詢的方式。 startAt,endAt等在您傳遞給orderBy的字段上進行操作。所以如果你做.orderBy("parent").startAt("foo")這是說「按doc.parent的值排序所有文檔,從doc.parent == foo開始」。

所以你必須在這裏做一些改變。首先,它會更容易查詢,如果您存儲文檔在信的價值,所以你的文件看起來是這樣的:

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

然後你就可以做到這一點查詢:

/** 
* 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; 
    }); 
    }); 
} 

所以如果我沒有siblingsOf("j", "consonants")我會得到"g", "h", "j", "k", "l"的文件。

+0

我向所有文檔添加了「{val:letter}」。 'startAfter(letter)'按預期工作得到'np',但是:'pag.where(「parent」,「==」,「consonants」)。orderBy(「val」)。endAt(「m」)。limit (3)'get'bcd'前3個輔音,而不是前面'kl'加'm' –

+0

@AlinC是的,你是對的我犯了一個錯誤。在使用'endAt'和'limit'的屬中並不是一個好主意,因爲查詢結果將以這些更強的約束中的任何一個結束。讓我更新。 –

+0

我認爲我們已經使用'unshift'而不是'push'來代替'threeBefore',因爲我們得到了'm l k n p'而不是'k l ​​m n p'。我會盡量自我更新你的答案。我無法編輯它,我必須編輯更多,然後像6個字符。無論如何,我知道如何分頁知道,謝謝。 –

0

在firebase上有Pagination & Query的文檔。我們必須使用startAt()或startAfter()方法來定義查詢的起始點。同樣,使用endAt()或endBefore()方法爲查詢結果定義一個結束點。