Firebase 数据库 Rest API:Returns 当所有节点都包含相同的值时结果不正确,除了一个

Firebase Database Rest API: Returns incorrect results when all nodes contain the same value except one

我有一个 Json 数据,使用

按最高查看次数排序

OrderBy("Views").LimitToLast(10)

除一个元素外,所有元素都具有相同的 (Views) 值。

这是完整的 Json 数据,没有添加特定限制:

https://ameen-66522.firebaseio.com/Main/News/Categories/Education/.json?print=pretty&orderBy=%22Views%22

{
  "-Mn7-ZxkUPO01dxifhtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01iddfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01idsdfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01idsdfhtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01idxfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifddhtpEn" : {
    "Views" : 50
  },
  "-Mn7-ZxkUPO01ifdshtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh21tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2dstpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2tpEdsn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2txpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifhds2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifhewtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifhtdxpEn" : {
    "Views" : 20
  }
}

当我使用

OrderBy("Views").LimitToLast(10)

它将正确获取前 10 个元素,Last Id 将为

-Mn7-ZxkUPO01ifddhtpEn

是与其余数据不同的值

这里是响应结果:

https://ameen-66522.firebaseio.com/Main/News/Categories/Education/.json?print=pretty&orderBy=%22Views%22&limitToLast=10

现在假设当我从 lastId

-Mn7-ZxkUPO01ifddhtpEn

最后值

50

它会正确 return 剩余的数据,事实上它会 return 在前 10 个中获取的数据,并且当所有数据都具有相同的视图值时会出现此问题,除了只有一处不同。

https://ameen-66522.firebaseio.com/Main/News/Categories/Education/.json?print=pretty&orderBy=%22Views%22&limitToLast=11&endAt=50,%22-Mn7-ZxkUPO01ifddhtpEn%22

{
  "-Mn7-ZxkUPO01idxfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifddhtpEn" : {
    "Views" : 50
  },
  "-Mn7-ZxkUPO01ifdshtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh21tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2dstpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2tpEdsn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifh2txpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifhds2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifhewtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifhtdxpEn" : {
    "Views" : 20
  }
}

它应该 return :

{
  "-Mn7-ZxkUPO01dxifhtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01iddfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01idsdfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01idsdfhtpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01idxfh2tpEn" : {
    "Views" : 20
  },
  "-Mn7-ZxkUPO01ifddhtpEn" : {
    "Views" : 50
  }

感谢您的帮助 :) 感谢您的工作

据我所知,当您按观看次数排序时,此节点是 JSON 中的最后一个节点:

"-Mn7-ZxkUPO01ifddhtpEn" : {
  "Text" : 6,
  "Title" : "some title",
  "Views" : 50
},

因此,当您执行此查询时:orderBy="Views"&limitToLast=10,您要求的是按 Views 计数排序的最后 10 个节点。

然后在下一个查询中使用 last 节点的键:orderBy="Views"&limitToLast=11&endAt=50,"-Mn7-ZxkUPO01ifddhtpEn", so now you're asking for the last 11 nodes ending at the last node already. That endAt clause is superfluous as far as I can see, to this is the same as orderBy="Views"&limitToLast=11.

这里要记住的是,您是从数据集的末尾向后分页。所以要得到倒数第二页,需要知道最后一页first项的Views+key