如何在Google Firestore中进行分页?
问题描述:
我有这个清单: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
从第二查询相结合,但我有别的东西:
我做了这个例子。
答
问题出在您形成查询的方式。 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"
的文件。
答
在firebase上有Pagination & Query的文档。我们必须使用startAt()或startAfter()方法来定义查询的起始点。同样,使用endAt()或endBefore()方法为查询结果定义一个结束点。
我向所有文档添加了“{val:letter}”。 'startAfter(letter)'按预期工作得到'np',但是:'pag.where(“parent”,“==”,“consonants”)。orderBy(“val”)。endAt(“m”)。limit (3)'get'bcd'前3个辅音,而不是前面'kl'加'm' –
@AlinC是的,你是对的我犯了一个错误。在使用'endAt'和'limit'的属中并不是一个好主意,因为查询结果将以这些更强的约束中的任何一个结束。让我更新。 –
我认为我们已经使用'unshift'而不是'push'来代替'threeBefore',因为我们得到了'm l k n p'而不是'k l m n p'。我会尽量自我更新你的答案。我无法编辑它,我必须编辑更多,然后像6个字符。无论如何,我知道如何分页知道,谢谢。 –