从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子

Posted

技术标签:

【中文标题】从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子【英文标题】:retrieve data from a list of specific IDs in Firebase, follow user and only get their posts 【发布时间】:2017-10-30 09:09:25 【问题描述】:

我有一个用户列表,他们每个人都可以发布事件并互相关注,当他们这样做时,数据库将生成一个带有userId 对象的feed 对象和他们可以看到的事件列表,就像这样:

Mo4JxyP4FCRtXYtNZAqs4EsLtTh2tq3bugOm5pRE2PxpmllKzUhKjty1 是用户 ID,-KIMxxx: true 是事件帖子。

在一个单独的events 对象中,我将事件的详细信息存储在那里:

目前,我在 redux 中检索所有事件,如下所示:

export const eventsFetch = () => 
  return (dispatch) => 
    firebase.database().ref(`/events/`)
      .on('value', snapshot => 
        dispatch( type: EVENTS_FETCH_SUCCESS, payload: snapshot.val() );
      );
  ;
;

如何重写该方法,使其仅从用户 ID 下的事件 ID 列表中检索数据?我试着做

firebase.database().ref(`/feed/$this.auth.currentUser.uid`)

先获取对象,然后使用Object.keys() 获取类似["eventId1", "eventId2"] 的数组,但现在我卡住了,不知道如何循环遍历所有对象

firebase.database().ref(`/events/$eventId`)

并像上面显示的方法一样将所有数据一起发送...不确定我是否要使用.once('value),因为我想在用户取消关注/关注时更新事件列表。

奖金请求,如果可能的话,正如您在events/$eventId/timeAsDate 中看到的那样,每个事件都有时间,我想隐藏/不检索过去的事件。

谢谢

更新 感谢弗兰克的回答,我终于可以使用以下代码:

export const eventsFetch = () => 
  const  currentUser  = firebase.auth();

  return (dispatch) => 
    firebase.database().ref(`/feed/$currentUser.uid`).on('value', snapshots => 
      const values = snapshots.val() || ;
      const entryIds = Object.keys(values);
      const promises = entryIds.map(
        eventId => firebase.database().ref(`/events/$eventId`).once('value')
      );

      Promise.all(promises).then(results => 
        results.forEach(result => 
          values[result.key] = result.val();
        );
        dispatch( type: EVENTS_FETCH_SUCCESS, payload: values );
      );
    );
  ;
;

【问题讨论】:

【参考方案1】:

这样的事情应该可以解决问题:

export const eventsFetchForUser = (uid) => 
  return (dispatch) => 
    firebase.database().ref(`/feed/$uid`)
      .on('value', snapshot => 
        var promises = [];
        snapshots.forEach((key) => 
          promises.push(
            firebase.database().ref(`/events/$key.key`)).once('value')
          );
        );
        Promise.all(promises).then((snapshots) => 
          const values = snapshots.map(snapshot => snapshot.val));
          dispatch( type: EVENTS_FETCH_SUCCESS, payload: values );
        );
      );
  ;
;

所以这首先从用户的提要中加载键,然后按其键加载每个帖子,最后提取每个帖子的快照的值,然后再分派它。

注意:我没有运行这个,所以可能有错别字。

【讨论】:

您的 Promise.all 呼叫无法正确解析 - 您需要转至 Promise.all(promises).then((snapshots) => //Results here ) 糟糕。好一个。谢谢你抓。固定。 嗨@FrankvanPuffelen 非常感谢您帮助解决另一个 Firebase 问题!我让它工作并更新了我的问题。另外,如果我想按时间对事件进行排序,而不是显示过去的事件,我应该在此方法中处理该逻辑,还是在之前或之后在另一种方法中处理?再次感谢 听起来很适合这种方法。但我会更新用户的提要,在这种情况下将时间戳作为一个值(而不仅仅是true),这样您就可以限制提要上的项目数量了。

以上是关于从 Firebase 中的特定 ID 列表中检索数据,关注用户并仅获取他们的帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何从firebase颤振中的文档中检索列表?

检索 Firebase NoSQL/JSON 数据的最佳方式?

获取firebase android中特定值的推送ID

如何从firebase检索多个数据到android中的列表视图?

未检索到特定集合 Firebase 的数据

从 Firebase Auto Id 中检索数据 - Firebase Swift