我是前端开发人员,并且第一次使用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');
问题
希望有人可以抽出时间回答我的问题。 谢谢。
答案 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)