当前位置: 首页 > 知识库问答 >
问题:

按具有最高优先级的用户ID排列的Firestore顺序

涂泰平
2023-03-14

我正在处理一个项目,在这个项目中,我需要对结果进行分页,以便加载DB中具有最高优先级的用户。else块是用户的初始加载,if块应该控制分页,但是我在分页调用时得到的结果是空的(0个文档),同时在初始调用中成功地获取了用户。

我有41个测试文档,限制设置为20个,所以我应该得到2个整页+1个额外的用户在第三个,但我只能得到(用户)文档的第一页。我查看了分页文档,并且我已经为firestore构建了索引,但是我仍然无法解决这个问题。如有任何协助,我们将不胜感激,并提前向您表示感谢。

if(lastId != null){
  return store.collection("users")
         .whereEqualTo("gender", searchingFor)
         .whereEqualTo("geoHashGroup", geoHashGroup)
         .orderBy("priority")
         .orderBy("userId")
         .startAfter(lastId)
         .limit(limit)
} else {
  return store.collection("users")
         .whereEqualTo("gender", searchingFor)
         .whereEqualTo("geoHashGroup", geoHashGroup)
         .orderBy("priority")
         .limit(limit)
}

共有1个答案

楚骞尧
2023-03-14

您不是在userid上对初始查询进行排序,这意味着数据库只按优先级顺序对文档进行排序,并从中返回“随机”20个用户。因此,无法保证LastID中的userid实际上是按userid排序时第20个用户的userid

除了startafter之外,分页查询通常完全相同,这就是为什么我通常将它们写成:

const query = store.collection("users")
         .whereEqualTo("gender", searchingFor)
         .whereEqualTo("geoHashGroup", geoHashGroup)
         .orderBy("priority")
         .orderBy("userId")
         .limit(limit);
if(lastId != null){
  query = query.startAfter(lastId);
}
return query;
 类似资料:
  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 问题内容: 我有一个庞大的产品数据库,每个星期天,我的脚本都会激活50个新产品。问题是,根据我脚本中的某些规则,我发现我应该优先激活一些产品。(以您的示例为例,它应该始终优先激活其中名称为“ hello kitty”和“ meshuggah”的产品,然后再进行其他操作) 我的数据库表包含有关产品的信息和唯一ID。可以说脚本找到了这些ID中的5个,标题中有hello kitty。 因此,我该如何进行

  • 我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。

  • 优先级队列未维护排序顺序我是否未正确执行?输出时出现错误的排序顺序? 产出:[1, 5, 8, 19, 9]

  • 我创建了一个名为Element的新o类对象,它有很多值“degree” 我想创建一个包含以下元素的优先级队列: 程序将打印: 但我想: 所以我想做的是,度值越大的元素优先级越高,被优先考虑。第二个问题是:如果两个元素具有相同的度值,那么它们将按哪个顺序取?

  • 问题内容: 以下是典型的读写器模式(很多读取而很少写入) 我想知道是否有可能优先考虑作家和读者?例如,如果其他线程不断持有读取锁,通常writer可能会等待很长一段时间(也许永远),因此有可能使writer具有更高的优先级,因此只要有writer出现,就可以认为它是高优先级(跳过行)之类的。 问题答案: 按照javadoc的,JDK实现并 不会 有任何读/写器的优先级。但是,如果你使用了“公平”的