【发布时间】:2018-02-20 11:55:57
【问题描述】:
我正在尝试使用 firestore beta 对文档进行分页。我在关注官方docs
我看到有一个 pageSize 参数来说明您要显示多少个文档,但我没有看到任何偏移选项。有人知道我怎么做分页系统吗?
谢谢
【问题讨论】:
标签: firebase google-cloud-firestore
我正在尝试使用 firestore beta 对文档进行分页。我在关注官方docs
我看到有一个 pageSize 参数来说明您要显示多少个文档,但我没有看到任何偏移选项。有人知道我怎么做分页系统吗?
谢谢
【问题讨论】:
标签: firebase google-cloud-firestore
从您的文档链接中,我假设您使用的是 REST API。在 REST API 中,有一个 pageToken 参数,您可以指定该参数。这可以从上一个请求返回的nextPageToken 派生而来。
{
"documents": [
{
object(Document)
}
],
"nextPageToken": ABCDEF1234567890,
}
projects/my-project/databases/my-database/documents or projects/my-project/databases/my-database/documents/chatrooms?pageSize=20&pageToken=ABCDEF1234567890
【讨论】:
Firestore 范围查询基于具有锚点的文档。所以你必须知道范围开始的文档(order-by properties),然后使用ref.startAfter(anchorDdoc).limit(10)(或ref.startAfter(valueOfAnchorDoc).limit(10))获取下一页。
Firestore 服务器端Admin SDKs have an offset() call,允许服务器确定要从哪个文档开始。但是客户端SDK没有这个方法。
【讨论】:
这可能有助于在没有页码的情况下进行分页(上一个和下一个):
app.get('/page/next/:startAt',(req, res)=>{
(async ()=>{
try{
const startAt = req.params.startAt;
let query = db.collection('movies');
let response = [];
console.log(query);
await query.orderBy('time', 'desc').where("time", "<", new Date(parseInt(startAt)*1000)).limit(16).get().then(snapshots => {
let docs = snapshots.docs;
for (let doc of docs){
console.log(doc.data());
const selectedItems = {
id: doc.id,
name: doc.data().name,
desp: doc.data().desp,
site: doc.data().site,
time: doc.data().time
}
response.push(selectedItems);
}
return response; //each then should return a vlue
})
return res.status(200).send(response);
}catch (error){
console.log(error);
return res.status(500).send(error);
}
})();
});
app.get('/page/back/:backAt',(req, res)=>{
(async ()=>{
try{
const backAt = req.params.backAt;
let query = db.collection('movies');
let response = [];
console.log(query);
await query.orderBy('time', 'desc').where("time", ">", new Date(parseInt(backAt)*1000)).limit(16).get().then(snapshots => {
let docs = snapshots.docs;
for (let doc of docs){
console.log(doc.data());
const selectedItems = {
id: doc.id,
name: doc.data().name,
desp: doc.data().desp,
site: doc.data().site,
time: doc.data().time
}
response.push(selectedItems);
}
return response; //each then should return a vlue
})
return res.status(200).send(response);
}catch (error){
console.log(error);
return res.status(500).send(error);
}
})();
});
【讨论】: