根据Firebase实时数据库问题中的另一个属性查询子节点

时间:2019-08-29 17:47:47

标签: angular firebase firebase-realtime-database angularfire2

我在firebase中的数据如下:

/users
  --key1
    --cards
       --card1
         --name: X
         --age: 40
       --card2
         --name Y
         --age  45 
    --email: xx@yy.com

查询数据的代码如下所示

  this.userCardList = this.db.list<Card>('users', ref => ref.orderByChild('email').equalTo(email))

    return this.userCardList.snapshotChanges().pipe(
       map(changes => 
        changes.map(c => ({ key: c.payload.key, ...c.payload.val()}))
       )
      ) ;

我正在如下调用我的component.ts

 ngOnInit() {
    this.cards =   this.dataSvc.fetchUserCards(this.core.email).pipe(
      map((cards: any) => cards.map(cardObj => {
            var c = new Card(cardObj.key)

                  c.firstName = cardObj._firstName
                  c.lastName = cardObj._lastName
                  c.jobTitle = cardObj._jobTitle

                return c
        }))
    );
  }

问题是上述代码未映射到卡节点,而是映射到key1节点。如果将其替换为也不起作用的用户/卡。

我希望能够获取卡节点数据而不是父节点数据。

2 个答案:

答案 0 :(得分:1)

好的,我在评论中询问了输出,但是现在意识到我提出的示例无效。如果需要阵列,应将所有卡包装在一个对象内。而且在一个数组中拥有一个对象对象实际上没有任何意义,因此,您将获得一个带有所有卡片的对象,而不是一个包含一个项目的数组,就像这样:

{ 
  "card1": {"name":"name1", ... },
  "card2": {"name":"name2", ... }
}

因此,首先,您需要返回所需的cards节点。另外,您似乎也不希望按照我的评论返回文档的key,所以我们忽略它而只返回cards

map(changes => 
  changes.map(c => ({ ...c.payload.val().cards }))
)

然后,即使万一您从查询中列出了多个对象,我们也将其全部应用于单个对象:

this.cards = this.dataSvc.fetchUserCards(this.core.email).pipe(
  map(cards => return Object.assign.apply(null, cards))
);

这将在您的答案的顶部给出您想要的输出。

答案 1 :(得分:0)

所以我决定做些不同的事情。现在,我分两个步骤进行操作。首先,我使用电子邮件作为密码

 return new Promise((resolve, reject) => {
                  this.db.list("/users", ref => ref.orderByChild('email').equalTo(email)).snapshotChanges().pipe(
                    map(changes => 
                     changes.map(c => ({ key: c.payload.key, ...c.payload.val()}))
                    )
                   ).subscribe(
                    (res:any) => {
                        resolve(res)
                    },
                    err => {
                        console.log(err)
                        reject(err)
                    }
                  )}
                )

然后从密钥中按如下方式获取我需要的纸牌阵列

 this.userCardList = this.db.list<Card>('users/' + key + '/cards', ref => ref.orderByChild('_status').equalTo(GlobalVariables.SYNCED))

    return this.userCardList.snapshotChanges().pipe(
       map(changes => 
        changes.map(c => ({ key: c.payload.key, ...c.payload.val()}))
       )
      ) ;