Firebase 将对象列表到 Angular 中的可观察数组 2

Firebase List Objects to Observable Array in Angular 2

我已将 Flashlight 与我的 Angular 2 项目集成。手电筒执行以下操作:

  1. 自动将指定的 Firebase 路径编入 ElasticSearch 集群的索引并监视这些路径的更改,重新索引任何更改。
  2. 响应写入指定 Firebase 路径的查询对象(例如,'search/request'),将 ElasticSearch 响应写入指定的 Firebase 路径(例如,'search/response')。

响应以以下结构写入 Firebase:

使用 Angularfire 2,这就是我的搜索结果:

searchThreads(term: string) {
    let queryBody: Object = {
        index: 'firebase',
        type: 'thread',
        q: term
    }
    this.requestKey = this.af.database.list('/search/request').push(queryBody).key
}

如果我想要搜索的原始结果以及上图中显示的所有路径,我会这样做:

this.af.database.list(`search/response/${this.requestKey}`)

我要的是在_source找到的物品。我想遍历响应 hits 并用这些对象填充我的视图。我如何才能将这些对象放入可观察数组中?

我认为只提取 _source children 是不可能的。但是,您可以使它比提取完整的搜索响应更有效率。

每个命中都包含很少的来源信息,因此只需检索命中并将每个命中映射到它的 _source

this.af.database
  .list(`search/response/${this.requestKey}/hits/hits`)
  .map(hits => hits.map(hit => hit._source))

此外,您可以使用限制查询来提取 hits:

的子集
this.af.database
  .list(`search/response/${this.requestKey}/hits/hits`, {
    query: {
      limitToFirst: 10
    }
  })
  .map(hits => hits.map(hit => hit._source))

或者,如果您有一些最低分数标准,您可以在按 child:

排序后执行查询
this.af.database
  .list(`search/response/${this.requestKey}/hits/hits`, {
    query: {
      orderByChild: '_score',
      startAt: 1.0
    }
  })
  .map(hits => hits.map(hit => hit._source))

(我没有使用过手电筒,所以我不确定评分是如何工作的,但是 startAt and/or endAt 的某种组合应该可以让您优化查询。 )