如何在Google Firestore中进行分页?

时间:2017-10-17 15:15:20

标签: javascript firebase google-cloud-firestore

我有这个清单:a b c d e f g h i j。我希望从列表中获取所选项目的3个项目。如果我选择了e,则结果列表应为d e f,如果我选择了f,则结果应为e f g,依此类推。

我做了这个例子:

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我应该parent:"consonants",他们都有来自第一个查询的k l mn p和来自Log的{​​{1}}第二个查询,但我还有别的。

2 个答案:

答案 0 :(得分:1)

Pagination & Query上的firebase上有文档。我们必须使用startAt()或startAfter()方法来定义查询的起始点。同样,使用endAt()或endBefore()方法为查询结果定义一个终点。

答案 1 :(得分:0)

问题在于您构建查询的方式。 startAtendAt等对您传递给orderBy的字段进行操作。因此,如果你.orderBy("parent").startAt("foo")说'#34;按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"的文件。