添加“ Where”子句时,查询侦听器不起作用

问题描述

我有一个查询,该查询使用RxSwift和RxFirebase向集合视图提供“提要”数据。 现在,此Feed数据具有“隐私”字段(可能的值:“公共”,“子”和“私人”),我需要过滤掉“私人”实体。

但是,当我添加“ Where”子句来执行此操作时,侦听器不再从该集合中添加新发布的实体。对此函数的第一次调用始终将“ listen” bool设置为true,因为它希望侦听用户发布/删除的新实体。 我不知道为什么这些事件不会触发查询

这是当前的查询代码

 func fetchGlobalFeed(limit: Int,startAfter: Timestamp?,listens: Bool) -> Observable<[Entity.Fragment]> {
     var query = db.collection(k.mCollection)
         .limit(to: limit)
         .order(by: "PublishedAt",descending: true)

    if let timestamp = startAfter {
         query = query.start(after: [timestamp])
    }

    let observable = listens ? query.rx.listen() : query.rx.getDocuments()
    return observable
          .catchErrorJustComplete()
          .map(FirestoreHelpers.dataFromQuerySnapshot)
          .map { data in
               data.compactMap {
                   try? FirestoreDecoder()
                       .decode(Entity.Fragment.self,from: $0)
               }
          }
 }

并将查询更改为:

 var query = db.collection( k.mCollection ) 
               .limit( to: limit ) 
               .whereField( "Privacy",in: ["Public","Sub"] ) // <- this causes issue with listener 
               .order( by: "PublishedAt",descending: true )

也许可以解释听众的工作方式以及任何建议。 谢谢。

 RxFirebase version: 0.3.8

*编辑: 我没有足够的代表来发布图片,这很奇怪,因为我以前能够这样做。 (说需要10次重复)

这是调试输出

2020-09-10 11:37:03.101:MagmaFirestoreProvider.swift:165 (fetchGlobalFeed(limit:startAfter:listens :))->已订阅

2020-09-10 11:37:03.324:MagmaFirestoreProvider.swift:165 (fetchGlobalFeed(limit:startAfter:listens :))->事件 next([Entity.Fragment(ref:, 发布者:可选(UserEntity.Fragment(ref:用户名:“ Art_Collective”,名称:nil ......... 隐私:可选(magma.MagmaMagPrivacy.Public))])

2020-09-10 11:37:03.458:MagmaFirestoreProvider.swift:165 (fetchGlobalFeed(limit:startAfter:listens :))->事件已完成

2020-09-10 11:37:03.458:MagmaFirestoreProvider.swift:165 (fetchGlobalFeed(limit:startAfter:listens :))-> isdisposed

将新项目发布到具有“ Sub”保密性的Feed中时,该项目不会出现,并且调试输出为零。 我必须刷新集合视图以获取上面的输出和提要中的新项目。

我认为那是因为可观察物正在处置?

解决方法

如以上注释中所建议,我在Firebase控制台中为查询创建了一个复合索引。

我将指出,以某种方式具有索引结构很重要。 我尝试使用以下设置创建索引:

收藏ID:“ mags”

  • 字段1:“ PublishedAt”:“ Descending”
  • 字段2:“隐私”:“降序”

(注意:firebase文档说使用“升序”或“降序” 当您使用'in'子句时,即使您未对此进行订购 字段,则不会影响查询结果的均等性

该索引由于某些原因无法正常工作,我不确定为什么...

但是,我意识到在我之前由开发人员创建的其他索引在机械上相似但结构不同。所以我用以下内容反映了这一点:

收藏ID:“ mags”

  • 字段1:“隐私”:“升序”
  • 字段2:“ PublishedAt”:“ Descending”

成功了!