Firebase亲爱的爱好者,
我在Firestore上遇到多次查询的问题。 我正在为iOS开发。
这是我要查询的数据结构:
Collection X
- Document A
- date: 1532271987 (timestamp)
- users: {
- user_id_1: "true"
- user_id_2: "true"
- user_id_3: "true"
- ...
}
- Document B
- date: ...
- users: {
- ...
}
- Documents...
我想查询以下文件:
在其user_id_x
词典中包含一个users
(例如users/user_id_x == true
)
AND
它的date
大于SOME_TIMESTAMP
基本上是在同一API请求上进行多次查询。
我也想按日期排序并限制获取的项目数以实现分页,但这就是我已经可以无缝管理的东西了,
鉴于我知道我要提取的size
个项目和一个fromDate
时间戳参数
collectionReference
.order(by: "date", descending: false)
.whereField("date", isGreaterThan: fromDate)
.limit(to: size)
这很好用。
不起作用的是,我无法通过服务器端的user_id_x
参数对此进行过滤。所以我不能只使用以下内容:
collectionReference
.order(by: "date", descending: false)
.whereField("date", isGreaterThan: fromDate)
.whereField("users/user_id_x", isEqualTo: true)
.limit(to: size)
我之前尝试过的内容:
1-
根据文档,通过使用users/user_id_x
使用/
访问此类数据结构上的user_id_x的方法应该可以根据文档使用,但我不能简单地使它工作。.(使用{{1} },使用users.user_id_x
访问更深的级别只会在SWIFT上崩溃)
那么,用户的结构不必是这样的。它可以是一个数组(我知道查询并不是那么受欢迎。。或者对象可以直接是这样的:
.
但是,在这种情况下,Firestore必须为每个- Document A
- date: 1532271987 (timestamp)
- user_id_1: "true"
- user_id_2: "true"
- user_id_3: "true"
- ...
创建一个单独的索引,这种方式对多次查询也不起作用。
2-
我尝试创建联合索引(像Querybase这样的库背后的想法),例如:
user_id_x
所以这种结构可以让我查询类似的内容:
- Document A
- date: 1532271987 (timestamp)
- users: {
- user_id_1: "true"
- user_id_2: "true"
- user_id_3: "true"
- ...
}
- date_user_id_1:"true_1532271987"
- date_user_id_2:"true_1532271987"
- ...
- date_user_id_x:"true_SOME_TIMESTAMP"
但这会获取与日期匹配的项目。.为了查询某事,例如
....whereField("date_user_id_x", isEqualTo: true_SOME_TIMESTAMP)
哪个查询....whereField("date_user_id_x", isGreaterThan: true_SOME_TIMESTAMP)
... Firestore(在控制台上)抱怨说,它必须在每个文档上创建名为isGreaterThan
的索引。每当用户与之关联时,都必须这样做。时间戳。.我不确定如何自动化它,但是索引工作也太多。.最重要的是,
我完全不知道如何以我希望的方式进行这项工作。
3-
客户端过滤
这是我要避免的事情。
所以背后的想法是,让我们从全局词典中提取10个项目,然后在本地设备上对其进行过滤,例如,如果该项目具有date_user_id_x
,则进行过滤。但这对于像我正在开发的社交媒体应用程序来说是不切实际的,因为它将有成百上千的用户。
我正在尝试避免这种情况,因为它会导致积极使用客户端网络,并且可能(最有可能)导致获取内容而导致与我们要过滤的特定用户无关的项目(因此,我必须构建一种机制,该机制会查询一次以上的时间,然后再查询一次,直到提取X项,这实际上很难管理。此外,我将根据结果获取图像数据,因此此处的任何错误都可能导致用户消耗过多数据。
4- 创建另一个词典/对象以将该工作划分为多个查询
因此,我实际上可以创建另一个字典来划分查询工作负荷。.我可以先按用户过滤,然后按日期过滤,然后使用从该字典中获取的结果提取user_id_x: true
。但这很难管理,因为我的应用程序上有近30多个工作和案例会导致Document_X
,Document_X
和user_id_X
关系的变化。将它们保存在一个字典中就可以了。但是要在两个字典中进行管理,只需要我编写30多个Google Cloud Functions,就可以简单地将第一个字典的更改模拟到另一个字典。根本不可行。我一直走这条路,放弃了我的第三个补偿功能,因为那时我很快就在Firebase上填写了数据使用配额(幸运的是我正在试用中)。
其他说明:
我检查了其他一些SO帖子,这些帖子基本上解决了我上面提到的几种解决方案。我还深入研究了Google论坛,并了解到Google自2015年以来一直在致力于这一工作,但还没有结果。
我认为应该有一种轻松的方式来做到这一点。.非常感谢您在此处提出的意见,想法和指导。