【问题标题】:Firebase: How to fetch objects from database from multiple IDs in to one list?Firebase:如何从数据库中的多个 ID 获取对象到一个列表中?
【发布时间】:2018-04-11 13:20:56
【问题描述】:

我有一个用户帖子表,与此处的 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);

我还有一个包含“朋友 ID”列表的用户表:

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

我想知道如何从 ID 位于当前用户的朋友数组中的“用户帖子”中获取所有对象?

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

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

这可能吗?如果没有,如何实现?

感谢大家的帮助! :)

【问题讨论】:

  • 查询 Firebase 是一件很痛苦的事,尤其是在您不扁平化数据库的情况下。例如。如果您有带有字段的帖子 - Type(类型选项为 AB)和 Length(长度选项为 longshort)并且您想要获取所有类型为 A 且长度为 long 的帖子,您应该创建另一个数据行,就像您现在拥有的 Posts。它可以命名为 Posts_A_Long。因此,每次您创建类型为 A 且长度为 long 的帖子时,您也会将其添加到此表中。 firebase.google.com/docs/database/web/…
  • 我怎样才能正确地展平我的示例以便能够获取正确的数据呢?我是否需要为用户和朋友的每个组合设置一个表?好像太多了……
  • FRIEND-ID-1 是它的uid?如果是这样,您可以一一查询他们的帖子并在客户端进行聚合,因为 Firebase 不支持服务器端的聚合。可能更好的方法是将 Firebase 的 Promise 转换为 Rxjs 的 Observables 并根据需要合并它们。
  • 我希望你不会那样说...好吧,那我试试。问题是我不能直接收听该列表上的更改。

标签: angular firebase firebase-realtime-database nosql


【解决方案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"
    ]
  }
}

到 =>

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

【讨论】:

  • 谢谢。会试试这个。 “FRIEND-ID-1”只是一个例子。我使用 UID,而不是字符串。
猜你喜欢
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2018-10-03
  • 2018-10-03
  • 2020-05-04
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多