【问题标题】:Querying a child node based on another attribute in firebase realtime database problem基于firebase实时数据库问题中的另一个属性查询子节点
【发布时间】:2019-08-29 17:47:47
【问题描述】:

我在 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
        }))
    );
  }

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

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

【问题讨论】:

  • 那么实际输出是什么,期望输出是什么?
  • 还有什么card1card2包含...
  • 我已更新问题以回答您的两个问题
  • I want the cards node。那么它应该是什么样子呢?你的意思是cards = [{card1: {...}}, {card2: {...}}]
  • 是的,你是对的

标签: angular firebase firebase-realtime-database angularfire2


【解决方案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))
);

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

【讨论】:

    【解决方案2】:

    所以我决定做一些不同的事情。现在,我分两步进行。首先,我使用电子邮件获取密钥

     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()}))
           )
          ) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多