我如何在 firestore 中按日期和位置可用性进行过滤?
How could I filter by date and location availability in firestore?
在我的 Firebase 项目中,我需要查询在某个城市的某个日期有空的所有用户,并按其他一些条件进行排序。
由于我们不能在一个查询中使用多个 "array-contains" 操作,我在 Firestore 中尝试了众所周知的 "map-trick",但现在我向查询添加了排序,这不再是一种选择.
let usersQuery = firestore.collection('Users')
.where('availableInAreaCodes.12345', '==', true)
.where('availableOnDates.2019-10-20', '==', true)
.orderBy('level', 'asc');
有什么想法吗?
您可以添加一个包含用户可用日期和区号组合的数组:
availableInAreaCodesOnDates:
["12345_2019-10-20", "94110_2019-10-20"]
然后您可以使用一个包含数组的运算符来查询它。
感谢@DougStevenson 和@FrankvanPuffelen 的帮助。
我发现文档数量、非规范化和 read/write 使用之间的一个很好的权衡。
注意:此解决方案可能不适合您的情况。
我为每个用户文档添加了一个新的子集合 'Availability',并将可用性数据拆分为一年中的几周(旧文档每周删除,每周添加一个新文档)。
我将 areaCodes 添加为一个数组,将每个工作日添加为一个字段,并将一组减少的用户数据添加到文档中。
我总共创建了 44 个复合索引(11 个字段 * 4 个排序组合)。 Firestore 的最大值为每个数据库 200 个。
在我的场景中这是值得的,因为这个查询是应用程序的一个关键特性。
let usersQuery = firestore.collectionGroup('Availability')
.where('areaCodes', 'array-contains', 'DE-1234')
.where('weekYear', '==', '2019-W42'))
.where('monday', '==', 'available')
.orderBy('userPreview.level', 'asc'
在我的 Firebase 项目中,我需要查询在某个城市的某个日期有空的所有用户,并按其他一些条件进行排序。
由于我们不能在一个查询中使用多个 "array-contains" 操作,我在 Firestore 中尝试了众所周知的 "map-trick",但现在我向查询添加了排序,这不再是一种选择.
let usersQuery = firestore.collection('Users')
.where('availableInAreaCodes.12345', '==', true)
.where('availableOnDates.2019-10-20', '==', true)
.orderBy('level', 'asc');
有什么想法吗?
您可以添加一个包含用户可用日期和区号组合的数组:
availableInAreaCodesOnDates:
["12345_2019-10-20", "94110_2019-10-20"]
然后您可以使用一个包含数组的运算符来查询它。
感谢@DougStevenson 和@FrankvanPuffelen 的帮助。
我发现文档数量、非规范化和 read/write 使用之间的一个很好的权衡。
注意:此解决方案可能不适合您的情况。
我为每个用户文档添加了一个新的子集合 'Availability',并将可用性数据拆分为一年中的几周(旧文档每周删除,每周添加一个新文档)。
我将 areaCodes 添加为一个数组,将每个工作日添加为一个字段,并将一组减少的用户数据添加到文档中。
我总共创建了 44 个复合索引(11 个字段 * 4 个排序组合)。 Firestore 的最大值为每个数据库 200 个。
在我的场景中这是值得的,因为这个查询是应用程序的一个关键特性。
let usersQuery = firestore.collectionGroup('Availability')
.where('areaCodes', 'array-contains', 'DE-1234')
.where('weekYear', '==', '2019-W42'))
.where('monday', '==', 'available')
.orderBy('userPreview.level', 'asc'