在firestore中按日期过滤(Flutter)

问题描述 投票:0回答:3

我是 firestore 的新手,正在构建一个允许用户租用自行车的应用程序。当用户租用自行车时,他们必须在特定日期预订。 我想执行一个查询来检索尚未在特定日期预订的车辆。假设用户选择6月28日,查询结果应该是28日尚未预订的车辆。

在 firestore 中,我将预订的日期保存为数组,如下所示

所以我尝试使用它来获取不在数组中的日期,但它似乎不起作用。

List dates = [2021-08-05-25.12.00.000000];
FirebaseFirestore.instance
.collection('bicycles')
.where('bookedDates',whereNotIn: dates)
.get()

如果有任何帮助,我将不胜感激

flutter firebase google-cloud-platform google-cloud-firestore
3个回答
2
投票

一种可能性是调整您的数据模型。您可以为每个日期提供一个文档,其中有一个数组类型的字段,其中包含所有车辆(自行车?)ID。

每次在给定日期预订车辆时,您都会从日期文档中删除车辆 ID。您应该使用 Transaction 进行预订,这样您就可以确保更新操作(从数组中删除车辆 ID)仅使用服务器上可用的最新数据进行。

这样,就可以很容易地查询给定日期可用的车辆。


您可以使用预定的云功能启动日期文档。例如,您可以创建本月开始前六个月的该月的所有日期文档。这完全取决于您的业务案例。


1
投票

这就是查询限制。您必须组合两个查询才能实现该行为,如下所示:

var s1 = FirebaseFirestore.instance
    .collection('bicycles')
    .where('bookedDates', isLessThan: '...28june...')
    .get();
  
var s2 = FirebaseFirestore.instance
    .collection('bicycles')
    .where('bookedDates', isGreaterThan: '...28june...')
    .get();

1
投票

首先,

bookedDates
是一个数组。在我看来,您正在尝试执行与
array-contains
相反的操作,即获取
bookedDates
不包含
dates
中的任何值的文档。据我所知,没有这样的运营商。

© www.soinside.com 2019 - 2024. All rights reserved.