Ios 对Firebase/Firestore的多次查询

Ios 对Firebase/Firestore的多次查询,ios,firebase,google-cloud-firestore,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_

亲爱的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...
我想查询以下文档:

在其
users
字典上包含
user\u id\u x
(比如
用户/user\u id\u x==true

它的
日期
大于
某个时间戳

这基本上是对同一个API请求的多个查询

此外,我希望按日期订购,并限制获取的项目数量,以启用分页,但这是我已经可以无缝管理的,如下所示:

- Document A
          - date: 1532271987 (timestamp)
          - user_id_1: "true"
          - user_id_2: "true"
          - user_id_3: "true"
          - ...
考虑到我知道要获取的项目的
大小
,以及
fromDate
时间戳参数

这个很好用

不起作用的是,我不能让服务器端的
user\u id\u x
参数对其进行过滤。因此,我不能简单地使用以下内容:

collectionReference
                  .order(by: "date", descending: false)
                  .whereField("date", isGreaterThan: fromDate)
                  .whereField("users/user_id_x", isEqualTo: true)
                  .limit(to: size)
我以前尝试过的:

1-

使用
/
用户/user\u id\u x
访问此类数据结构上的user\u id\u x的方式应该根据文档工作,但我不能简单地让它工作。。(使用
users.user\u id\u x
时,使用
访问较深的级别只会在SWIFT上崩溃)

那么,用户的结构不必是这样的。。它可以是一个数组(我知道查询时不太喜欢使用它)。或者对象可以直接如下所示:

- Document A
          - date: 1532271987 (timestamp)
          - user_id_1: "true"
          - user_id_2: "true"
          - user_id_3: "true"
          - ...
但是,在这种情况下,Firestore必须为每个
用户\u id\u x
创建单独的索引,顺便说一句,这对多个查询也不起作用

二,-

我尝试创建连接索引(Querybase等库背后的想法),例如:

- 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(在控制台上)抱怨说,它必须在每个文档上创建名为
date\u user\u id\u x
的索引。每次用户与时间戳相关时,都必须这样做。我不确定如何实现自动化,但这将是太多的索引工作。最重要的是, 我完全不知道如何按照我希望的方式来完成这项工作

3-

客户端筛选

这是我一直在努力避免的

因此,背后的想法是,让我们从全球词典中提取10个条目,然后在本地设备上对它们进行过滤,例如,如果条目具有
user\u id\u x:true
,则进行过滤。但这对于我正在开发的社交媒体应用程序来说是不切实际的,因为它会有成百上千的用户

我试图避免它,因为它会导致积极使用客户端的网络,并且可能(最有可能)导致获取与我们要筛选到的特定用户无关的项目(所以我必须建立一种机制,再查询一次,再查询一次,直到它提取X数量的项目,这实际上太难管理)。此外,我将根据结果提取图像数据,因此这里的任何错误都可能导致用户消耗太多数据

四,- 创建另一个字典/对象以在多个查询中分割此作业

因此,我实际上可以创建另一个可以划分查询工作量的字典。我可以先按用户筛选,然后按日期筛选,然后使用该字典的获取结果来提取
文档。但这太难管理了,因为我的应用程序上有近30多个作业和案例会导致
文档的更改ument\u X
user\u id\u X
一些日期
关系。在一个字典中维护这些关系很好。但是在两个字典中管理它们只需要我编写30多个谷歌云函数,这将简单地模拟第一个字典对另一个字典的更改。这根本不实用。我一直在在我的第三次补偿功能完成后,我放弃了,因为我很快就在Firebase上完成了我的数据使用配额(幸运的是我正在试用)

附加说明:

我查看了其他一些SO帖子,基本上解决了我上面提到的几个解决方案。我还深入研究了谷歌论坛,了解到谷歌自2015年以来一直在研究这个问题,但还没有结果


我认为应该有一个聪明的方法可以轻松做到这一点。我非常感谢您在这里的评论、想法和指导。

您的问题中有很多信息,但如果我理解正确,这段代码不起作用:
collectionReference.order(by:“date”,descending:false).whereField(“date”,大于:fromDate)。whereField(“users/user\u id\u x”,isEqualTo:true)。限制(到:大小)
。什么不起作用?是否有错误消息(如果是,是什么错误)?或者它给出了错误的结果(如果是,结果有什么错误)你说得对。我希望能够对这样的结构对象进行两次查询:
collection{document{date:1532271987.240483,description:“Test description”,feeds{6roghv3jmfqlpbuqcw1savyyej2:true,ajyooxojwaoikmoyed9l8bisb2:true}
要查询这个,我正在尝试:
collectionReference.order(by:“date”whereField(“date”,大于:fromDate)。whereField(“feeds/\(userId)”,isEqualTo:true)。limit(to:size)
它给我这个错误:
error Domain=FIRFirestoreErrorDomain code=9“查询需要索引。您可以在此处创建它:LINK..
当我单击链接时,它会打开FB控制台,提供此索引:
提要。AJH…8BiSb2
ASC
日期
ASC
何时