Firestore startAfter方法不适用于文档作为参考

时间:2020-08-05 22:39:59

标签: javascript firebase google-cloud-firestore

我遇到了无法在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 .....

2 个答案:

答案 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