如何处理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 个要过滤的参数来自 directionIdKey
、Transac.flagKey
、officeIdKey
。您要下单:filter.orderBy
。
我相信这些参数包含字段名称。
我们需要一个将出现在所有查询中的字段。我们使用您的 orderBy 字段。 所以创建 3 个复合索引。
-
filter.orderBy 和 directionIdKey ASC
filter.orderBy 和 Transac.flagKey ASC
filter.orderBy 和 officeIdKey ASC
这应该可以处理您的查询。
【讨论】:
谢谢你的工作。因为我误解了索引是如何工作的。我以为我必须创建可见字段的所有索引。非常感谢 不客气。很高兴我能提供帮助。以上是关于如何处理firebase中多个where查询的索引?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理带有斜线的 Laravel Eloquent “WHERE”查询? (Laravel 5.3)