Firebase:如何从数据库中将对象从多个ID提取到一个列表中?

时间:2018-04-08 16:23:24

标签: angular firebase firebase-realtime-database nosql

我有一个用户帖子表,与Firebase文档中描述的完全相同: https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

//From docs

var updates = {};

//I'm not actually doing this
updates['/posts/' + newPostKey] = postData; 

//I'm doing this
updates['/user-posts/' + uid + '/' + newPostKey] = postData; 

return firebase.database().ref().update(updates);

我还有一个用户表,其中包含“friend-ids”列表:

"users": {
  "USER-ID-1": {
    ...
    "friends": [
      "FRIEND-ID-1",
      "FRIEND-ID-2"
    ]
  }
}

我想知道如何从“user-posts”获取所有对象,其中ID位于当前用户的friends-array中?

这在文档中没有描述,我猜它是正确的数据模型,如果他们以它为例......? 我没有找到任何关于如何基于多个ID从表中获取所有实例的示例。

所以:如何将所有来自FRIEND-ID-1和FRIEND-ID-2的用户帖子作为一个列表返回,我可以循环并在视图中显示。

这可能吗?如果没有,怎么能实现呢?

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

我认为这会让你走上正轨。

这些在我的构造函数中:

constructor(private db: AngularFireDatabase, public afAuth: AngularFireAuth) {}

这是我获取炒作的方法:

  getFriendPosts(){
    this.getListOfFriends().then(data => {
      data.forEach(friend => {
        this.db.database.ref("user-posts/" + friend.uid).once('value').then((snapshot) => {
          snapshot.forEach(post => {
            console.log(post.val());
          });
        }).catch((err) => {
           console.log(err);
        });
      });
    }).catch(err =>{
      console.log(err);
    });
  }

  getListOfFriends(){
    let items: any = [];
    var mList = [];
    return this.db.database.ref("users/" + this.afAuth.auth.currentUser.uid + "/friends").once('value').then((snapshot) => {
      snapshot.forEach(user => {
        mList.push(user.val());
      });
      return items = mList;
    }).catch((err) => {
      return err;
    });
  }
PS:我没有测试过这段代码。另外,我建议您将朋友列表UID设置为对象而不是字符串。

"users": {
  "USER-ID-1": {
    ...
    "friends": [
      "FRIEND-ID-1",
      "FRIEND-ID-2"
    ]
  }
}

to =>

"users": {
  "USER-ID-1": {
    ...
    "friends": [
      {uid: "FRIEND-ID-1"},
      {uid: "FRIEND-ID-2"}
    ]
  }
}

或者,如果你想让它成为可观察列表,我会试试这个:

import { Observable } from 'rxjs/Observable';

items: Observable<any[]>;

this.items = db.list("user-posts/" + friend.uid).valueChanges();

所以也许是这样的:

  listOfAllPosts: any = [];
  friendPostsList: Observable<any[]>;

  getFriendPosts(){
    this.getListOfFriends().then(data => {
      data.forEach(friend => {
        this.friendPostsList = this.db.list("user-posts/" + friend.uid).valueChanges();
        this.listOfAllPosts.push(this.friendPostsList);
      });
    }).catch(err =>{
      console.log(err);
    });
  }