2017-10-17 5 views
1

私はこのリストを持っています:a b c d e f g h i j。私は選択された項目の周りのリストから3つの項目を取得したい。 eを選択した場合、結果リストはd e fになります。fを選択した場合、結果はe f gとなります。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))outに私がk l m n pを持っている必要があり、それらはすべて2番目のクエリからn pと組み合わせる最初のクエリからparent:"consonants"k l mを持っているが、私は何か他のものを持っています。

答えて

0

問題は、クエリを構成する方法にあります。 startAtendAtなどは、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"、 "=="、 "子音")orderBy( "val")endAt( "m")。limit (3) '' bcd'を前の '' kl'と 'm'の代わりに最初の3つの子音にします –

+0

@AlinCはいあなたは間違いを犯しました。 'endAt'と' limit'を一緒に使うことは、良い結果ではありません。なぜなら、どちらかが強い方の制約であるからです。私に更新させてください。 –

+0

私は、 ''私は ''私は '' '' '' ''の代わりに '' '' '' '' '' 'を得るので、' 'threeBefore''に対して' 'プッシュ 'あなたの答えを自分自身で更新しようとします。私はそれを編集することはできません、私は6文字以上のように編集する必要があります。とにかく私はページ付けする方法を知っている、ありがとう。 –

0

firebaseにはPagination & Queryという文書があります。 startAt()メソッドまたはstartAfter()メソッドを使用して、クエリの開始点を定義する必要があります。同様に、endAt()またはendBefore()メソッドを使用して、クエリ結果のエンドポイントを定義します。

関連する問題