我正在使用Firebase Firestore作为数据库,并且编写了Firebase函数来从Firestore数据库检索数据。
我要实现的是分页,并且根据我已经为我的firebase函数实现代码的文档。下面是代码:
exports.getBillList = functions.https.onRequest((req, res) => {
let docs=[];
let limit = 15;
return cors(req, res, () => {
let lastBillInList=req.query.lastBillInList;
console.log("lastBillInList value: " + lastBillInList);
if (lastBillInList === null || lastBillInList === undefined) lastBillInList = 0;
//var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length - 1];
if(lastBillInList==0){
console.log('first time call: as no lastbillseqq');
db.collection("bills").orderBy('billNo','desc').limit(limit).get().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
docs.push(doc.data());
});
res.status(200).send(docs);
}).catch(function (error) {
console.error("Error getting list: ", error);
res.status(500).send();
});
}else{
console.log('second time call: as no lastbillseqq'+ lastBillInList);
db.collection("bills").orderBy('billNo', 'desc').startAfter(lastBillInList).limit(limit).get().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
docs.push(doc.data());
});
res.status(200).send(docs);
}).catch(function (error) {
console.error("Error getting list: ", error);
res.status(500).send();
});
}
});
});
我已经在我的Firebase函数中添加了条件,该条件可以检查是否提供了最后一个账单号。
如果是,则检索最后一个帐单之后的所有帐单记录,直到设置的限制;否则,如果未提供最后一个帐单号,则将其视为第一个请求并检索达到限制的初始记录
无论如何,我面临的问题是,无论执行else部分的代码如何,当提供了最后一个帐单号时,查询总是从结果的开始一直返回指定的记录数。由于某种原因StartAfter无法正常工作
例如,我有账单号形式为1到25的记录,我在上面的代码中按降序排列它们,因此结果是从账单号25到1。
当没有提供帐单号时,我会得到帐单号从25到11的结果。 当我提供帐单号时,我得到的结果是帐单号25到11,而不是预期的帐单号10到1。
有人可以帮我吗?
答案 0 :(得分:3)
我可以通过以下代码进行分页。在我的模型对象中,我使用了Document ID,据此我可以找到documentReference-> documentSnapshot。我最终使用documentSnapshot进行比较(这是我的错误,因为之前我没有使用documentSnapshot)以获取所需的输出。
下面是我的代码:
exports.getBillList = functions.https.onRequest((req, res) => {
console.log("----------------------------------function start");
let docs = [];
let lastBillInList=req.query.lastBillInList;
if(lastBillInList===undefined){
lastBillInList="noDocument";
}
let limit = 15;
return cors(req, res, () => {
var lastVisible = db.collection("bills").doc(lastBillInList);
lastVisible.get().then(function (doc) {
if (doc.exists) {
db.collection("bills")
.orderBy("billNo", "desc")
.startAfter(doc)
.limit(limit).get().then(function(querySnapshot){
querySnapshot.forEach(function (doc) {
//console.log(doc.data().billNo + " pushed.." + ": last bill was: " + tempBill);
docs.push(doc.data());
});
return res.status(200).send(docs);
});
} else {
db.collection("bills")
.orderBy("billNo", "desc")
.limit(limit).get().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
docs.push(doc.data());
});
return res.status(200).send(docs);
});
}
}).catch(function (error) {
console.log("Error getting document:", error);
return res.status(500).send();
});
console.log("----------------------------------function end");
});
});
答案 1 :(得分:0)
好的,我发现了一个有趣的观点。您必须在start(afterDocument:)
前致电limit(to:)
,否则它将无法正常工作。
所以应该像下面这样:
db.collection("collection")
.order(by: "createdAt", descending: true)
.start(afterDocument: snapshot) // This is where you need to put start
.limit(to: Constants.Database.Feed.limit)
.getDocuments { (snapshot, error) in
// some useful stuff
}