使用Firebase获取用户事件(多对多关系)

时间:2019-06-23 04:01:17

标签: javascript firebase google-cloud-firestore nosql

我是前端开发人员,并且第一次使用Firebase构建应用程序。我阅读了一些文档/文章,并观看了有关外键(多对多关系)的这段有趣的视频:https://www.youtube.com/watch?v=ran_Ylug7AE&list=PLl-K7zZEsYLlP-k-RKFa7RyNPa9_wCH2s&index=2

我正在尝试采用这种方法来检索特定用户的事件。理想情况下,我希望获得此信息而无需请求/支付过多数据。首先,这就是我设置以下数据库结构的方式(请参见视频):

{
  users:
    "abc": {
      firstname: "Maxime",
      ...
    },
    "def": {
      firstname: "John",
      ...
    },
  },
  events: {
    "eventAbc-": {
      title: "Some great event",
      ...
    },
    "eventDef": {
      title: "Another great event",
      ...
    } 
  },
  eventAttendees: {
    "eventAbc": {
      abc: true,
      def: true,
    },
    "eventDef": {
      abc: true,
    } 
  }
}

要获取用户的事件,我需要执行以下操作:

getEvents(userId) {
  const self = this;
  const query = firebase.firestore().collection('eventAttendees');
  var promises = [];
  query.onSnapshot(function(snap) {
    snap.docs.forEach(doc => {
      const data = doc.data();
      if (data[userId]) {
        // user has been invited to this event
        promises.push(self.getEvent(doc.id));
      }
    });
    Promise.all(promises).then((results) => {
      console.log("All events");
      console.log(results);
    });
  });
}

getEvent(eventId) {
  return new Promise((resolve) => {
    const query = firebase.firestore()
    .collection('events')
    .doc(eventId);
    query.onSnapshot(function(snap) {
      resolve(snap.data());
    });
  });
}

getEvents('abc');

问题

  1. 我不认为/不知道我是否拥有正确且经过优化的方法?我应该参考任何文档/ Github项目吗?
  2. 如果“ abc”被邀请参加100万个活动,会发生什么?我感觉到,我正在循环播放,需要开箱即用处理分页。有更好的方法吗?
  3. 假设每个事件都有很多信息(详细信息)。但是,在主页上,我只需要显示主要信息(事件标题,事件日期)。我应该将其存储在哪里以避免加载大量信息。

希望有人可以抽出时间回答我的问题。 谢谢

2 个答案:

答案 0 :(得分:0)

您似乎正在看David出色的视频系列Firebase for SQL developers,该系列是为Firebase实时数据库编写的。由于您的代码使用Cloud Firestore API,因此建议您切换到Todd的Getting to know Cloud Firestore系列,该系列包含类似的信息以及更多内容,但随后针对Firestore进行了调整。

  

如果'abc'被邀请参加100万个活动,会发生什么?

没有用户会观看这百万个事件。所以不要加载它们。考虑用户将实际看到多少个项目,然后加载这些项目。通常,这将是一个或几个屏幕。如果您认为他们可能希望加载更多内容,请允许他们加载新页面。搜索firebase和分页,以查看有关该主题的许多问题。

  

让我们假设,每个事件都有很多信息(详细信息)。但是,在主页上,我只需要显示主要信息(事件标题,事件日期)。我应该将其存储在哪里以避免加载大量信息。

您应该只加载所需的数据。如果在初始列表视图中需要每个事件的数据子集,请创建一个单独的节点或集合,其中仅包含每个事件的信息。是的,您确实以这种方式复制数据,但这在NoSQL数据库中是很正常的。

答案 1 :(得分:0)

感谢您抽出宝贵的时间回答我的问题。的确,我喜欢这个视频系列,也很期待观看您推荐的视频系列,

我同意您的意见,并且绝对只希望加载所需的内容。目前,我没有太多数据,因此很难设想/预料到。我本应该在getEvents函数中利用.limit(10)或.startAt()的优势?

我一般不熟悉数据库,并且真的不知道每个事件的数据子集应该放在哪里?以下是您称为初始列表视图的内容吗?以我为例,这是正确的地方吗?如果没有,那该放在哪里?

l = eval(input("Enter a nested list : "))
a = len(l)
for x in range(0,a):
     a[x]+=a[x]
print(l)