如何在Firebase Firestore中使用多个orderBy查询进行排序?



如果我想按照这个场景对文档进行排序-

  • 选择库存产品(通过检查名为"count"的字段);指定产品的总件数)
  • 根据另一个名为"price"的字段对元素排序。

看起来很简单,只需使用以下代码-

DBRef.collection("col")
.where("count", isNotEqual: 0)
.orderBy("price")
.get();

但是这会抛出一个错误,由于firebase firestore的限制。因此,我们必须在任何其他orderBy查询之前使用另一个orderBy("count")查询。

DBRef.collection("col")
.where("count", isNotEqual: 0)
.orderBy("count")
.orderBy("price")
.get();

这将根据count字段对文档进行排序,而不是根据price字段。如何同时根据price字段对docs列表进行排序?

我甚至在,

周围尝试了的工作
databaseReference
.collection("products")
.where("tags", arrayContains: tag)
.where("sellingPrice", isGreaterThan: 0)
.orderBy("sellingPrice", descending: isDesc)
.where("totalUnit", isGreaterThan: 0)
.orderBy("totalUnit")
.limit(limit)
.get()

我为"sellingPrice"字段,因此我必须在第一个orderBy语句中添加orderBy(" sellingprocess ")。但是我仍然得到错误

Failed assertion: line 421 pos 16: 'field == orders[0][0]': The初始orderBy()字段'[[FieldPath([sellingPrice]), false]][0][0]'必须与where()字段参数相同` FieldPath([totalUnit]) `当调用一个不等式运算符时。

第二个查询的结果将首先按计数排序,然后按价格排序。如果不首先按计数排序,就无法从数据库中获取它们,因此必须在应用程序代码中重新排序。

可以考虑的是根本不给计数等于0的文档提供count字段。这将导致它们被排除在索引之外,这也意味着您可以将orderBy("count")放在查询的末尾。

或者,您可以添加与count字段同步更新的isInStock类型字段。一旦你这样做了,你可以做一个相等条件(where("isInStock", "==", true)),它不需要orderBy子句。

最新更新