在Firebase / Firestore上进行多次查询

时间:2018-07-21 12:18:34

标签: ios firebase google-cloud-firestore

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_XDocument_Xuser_id_X关系的变化。将它们保存在一个字典中就可以了。但是要在两个字典中进行管理,只需要我编写30多个Google Cloud Functions,就可以简单地将第一个字典的更改模拟到另一个字典。根本不可行。我一直走这条路,放弃了我的第三个补偿功能,因为那时我很快就在Firebase上填写了数据使用配额(幸运的是我正在试用中)。

其他说明:

我检查了其他一些SO帖子,这些帖子基本上解决了我上面提到的几种解决方案。我还深入研究了Google论坛,并了解到Google自2015年以来一直在致力于这一工作,但还没有结果。

我认为应该有一种轻松的方式来做到这一点。.非常感谢您在此处提出的意见,想法和指导。

0 个答案:

没有答案