如何处理firebase中多个where查询的索引?

Posted

技术标签:

【中文标题】如何处理firebase中多个where查询的索引?【英文标题】:How to deal with indexes of multiple where query in firebase? 【发布时间】:2021-11-12 01:04:39 【问题描述】:

在我的颤振应用中。我必须使用多个过滤器从 firebase 获取数据。

我做了如下。它有效,但问题是某些过滤器为空,因此我需要在 firebase 查询中跳过它,因此,即使我只有 2 个字段(姓名、年龄),我也必须创建 3 个索引来支持我的查询。第一个索引是:姓名,第二个索引是:年龄,第三个索引是:姓名和年龄。

Future<List<Transac>> getTrans(TransFilter filter, Transac? lastTrans) async 
const limit = 10;
var result =
    _collection.orderBy(filter.orderBy, descending: true).limit(limit);

if (filter.directionId != null) 
  result = result.where(directionIdKey, isEqualTo: filter.directionId);


if (filter.flag != null) 
  result = result.where(Transac.flagKey, isEqualTo: filter.flag);


if (filter.officeId != null) 
  result = result.where(officeIdKey, isEqualTo: filter.officeId);
 

if (lastTrans != null) 
  result = result.startAfter([lastTrans.createdAt.millisecondsSinceEpoch]);


final _result = await result.get().then(
    (value) => value.docs.map((e) => Transac.fromSnapshot(e)).toList());

return _result;

我尝试了以下方法,因为我认为我只需要一次创建所有索引,但它会引发错误,因为我无法在第一个 orderby 中不使用的字段上使用 isNotEqualTo。

Future<List<Transac>> getTrans(TransFilter filter, Transac? lastTrans) async 
const limit = 10;
var result =
    _collection.orderBy(filter.orderBy, descending: true).limit(limit);

if (filter.directionId != null) 
  result = result.where(directionIdKey, isEqualTo: filter.directionId);
else 
  result = result.where(directionIdKey, isNotEqualTo: '');


if (filter.officeId != null) 
  result = result.where(officeIdKey, isEqualTo: filter.officeId);
else 
  result = result.where(officeIdKey, isNotEqualTo: '');



if (lastTrans != null) 
  result = result.startAfter([lastTrans.createdAt.millisecondsSinceEpoch]);


final _result = await result.get().then(
    (value) => value.docs.map((e) => Transac.fromSnapshot(e)).toList());

return _result;

有什么解决方案或建议吗?非常感谢您的帮助,谢谢

【问题讨论】:

【参考方案1】:

您有 3 个要过滤的参数来自 directionIdKeyTransac.flagKeyofficeIdKey。您要下单:filter.orderBy

我相信这些参数包含字段名称。

我们需要一个将出现在所有查询中的字段。我们使用您的 orderBy 字段。 所以创建 3 个复合索引。

    filter.orderBy 和 directionIdKey ASC filter.orderBy 和 Transac.flagKey ASC filter.orderBy 和 officeIdKey ASC

这应该可以处理您的查询。

【讨论】:

谢谢你的工作。因为我误解了索引是如何工作的。我以为我必须创建可见字段的所有索引。非常感谢 不客气。很高兴我能提供帮助。

以上是关于如何处理firebase中多个where查询的索引?的主要内容,如果未能解决你的问题,请参考以下文章

mysql百万数据查询 用啥代替in,该如何处理

mysql 里面如何处理子查询返回多个查询结果的情况

如何处理带有斜线的 Laravel Eloquent “WHERE”查询? (Laravel 5.3)

Lumen 的 And Where 和 Where 条件如何处理?

7.where_如何处理NULL_isnull()

Firebase Auth UI 如何处理重新身份验证?