我遇到了无法在Firestore中处理数据的startAfter问题。 我给这个问题的两个例子,第一个是图像工作时,使用属性(createdAt)进行过滤,第二个图像传递整个文档,返回空值,并且无法使forEach遍历数据
有人知道会发生什么吗?这些文档没有任何复杂的信息,名称,创建日期以及所有测试编号。
如果有人遇到此问题,请几天前才开始学习Firebase。 在此先感谢:)
// getting the data
const response = await db
.collection("apis")
.orderBy("createdAt")
.limit(3)
.get();
const dataSend = [];
response.forEach((document) => {
dataSend.push(document.data());
});
//triggering the next data load
const getMore = async () => {
const limit = 3;
const last = apis[apis.length - 1]; // last document
console.log(last); // {name: "3", description: "3", createdAt: t, url: "3", authorId: 123123, …}
try {
const response = await db
.collection("apis")
.limit(limit)
.orderBy("createdAt")
.startAfter(last.createdAt) // passing createdAt to fix the problem
.get();
console.log(response);
const dataSend = [];
response.forEach((document) => {
//this is not entering here
dataSend.push(document.data());
});
} catch .....
第二种情况
// getting the data
const response = await db
.collection("apis")
.orderBy("createdAt")
.limit(3)
.get();
const dataSend = [];
response.forEach((document) => {
dataSend.push(document.data());
});
//triggering the next data load
const getMore = async () => {
const limit = 3;
const last = apis[apis.length - 1]; // last document
console.log(last); // {name: "3", description: "3", createdAt: t, url: "3", authorId: 123123, …}
try {
const response = await db
.collection("apis")
.limit(limit)
.orderBy("createdAt")
.startAfter(last) // PASSING THE WHOLE DOCUMENT AS A PARAMETER DO NOT WORK
.get();
console.log(response);
const dataSend = [];
response.forEach((document) => {
//this is not entering here
dataSend.push(document.data());
});
} catch .....
答案 0 :(得分:0)
实际上,第一个代码块正在运行是因为startAt()
的正确用法。
如您在Official Documentation中的示例中所见,应该在startAt()
中使用一个值,而不要使用完整的文档,并且如果您考虑通过以下方式对数据进行排序,这实际上是有意义的特定字段,您还应该在同一字段上以特定值开始搜索结果。
因此,根据您的情况,正确的用法确实是.startAfter(last.createdAt)
。
答案 1 :(得分:0)
该问题的解决方案是我获取数据,而不是 doc 参考。
要修复类似问题,您必须在代码中添加类似问题
response.docs [response.docs.length-1]
// getting the data
const response = await db
.collection("apis")
.orderBy("createdAt")
.limit(3)
.get();
const dataSend = [];
const last = response.docs[response.docs.length - 1] // this is the reference to the doc that the documentations says
response.forEach((document) => {
dataSend.push(document.data());
});
//triggering the next data load
const getMore = async () => {
const limit = 3;
const last = response.docs[response.docs.length - 1] // last document
console.log(last); // {name: "3", description: "3", createdAt: t, url: "3", authorId: 123123, …}
try {
const response = await db
.collection("apis")
.limit(limit)
.orderBy("createdAt")
.startAfter(last) //
.get();
console.log(response);
const dataSend = [];
response.forEach((document) => {
//this is not entering here
dataSend.push(document.data());
});
} catch .....
因此,不是通过数据库传递最后一个对象,而是在使用Firebase提供的data()函数进行转换之前,将最后一个引用传递给该文档。
还比传递object.createdAt更好。
https://firebase.google.com/docs/firestore/query-data/query-cursors