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

时间:2017-01-26 23:40:58

标签: angular elasticsearch typescript firebase angularfire2

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

  1. 自动将指定的Firebase路径索引到ElasticSearch集群,并监控这些路径以进行更改,重新索引任何更改。
  2. 响应写入指定Firebase路径的查询对象(例如,“搜索/请求”),将ElasticSearch响应写入指定的Firebase路径(例如,“搜索/响应”)。
  3. 响应将写入Firebase,具有以下结构:

    enter image description here

    使用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并用这些对象填充我的视图。如何将这些对象放入可观察的数组?

1 个答案:

答案 0 :(得分:1)

我不相信只能提取_source个孩子。但是,您可以使其比提取完整的搜索响应更有效。

每次点击都包含除源之外的其他信息,因此只需检索点击并将每次点击映射到其_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))

或者,如果您有一些最低分数的标准,您可以在孩子订购后执行查询:

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

(我没有使用过手电筒,所以我不确定评分是如何运作的,但startAt和/或endAt的某些组合可以让您优化查询。 )