我在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节点。如果将其替换为也不起作用的用户/卡。
我希望能够获取卡节点数据而不是父节点数据。
答案 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()}))
)
) ;