我在尝试解决这个问题时遇到了一些问题。我来自SQL背景,是Firebase数据库的新手。我正在建立一个网站,出售个人在线视频。我想要做的事情看起来很简单,但我无论如何也做不到。
我想要显示一个页面,其中只列出了用户已购买的视频,而不是整个可用的视频列表。显然,因为我只想让用户访问他们所购买的内容。目前,我可以显示所有视频的列表和每个类别的类别标题。我不知道如何限制这个列表,使其只显示用户购买的视频。
这是我的数据库结构

。
正如你所看到的,我把视频和他们的信息放在" videos“集合中,把用户放在" users”集合中。在每个用户的下面是一个"pvideos“集合,它显示了用户购买的每个视频的id。
我如何写这篇文章来限制列表只匹配用户购买的视频有什么想法吗?
包含的代码显示所有可用视频的分类标题和视频(当前),而不考虑购买状态。
var series = db.child('videos').orderByKey();
series.once('value')
.then(function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var videoseries = childSnapshot.key;
console.log(videoseries);
var seriesheading = document.createElement('h3');
seriesheading.textContent = videoseries;
seriesheading.setAttribute('class', 'bg-color-2');
document.getElementById("container").appendChild(seriesheading);
var videodata = db.child('videos/' + videoseries).orderByKey();
videodata.once('value')
.then(function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var videoid = childSnapshot.key;
var vimeo = childSnapshot.child('vimeo').val();
var videoname = childSnapshot.child('name').val();
var videolength = childSnapshot.child('length').val();
var videodesc = childSnapshot.child('desc').val();
console.log(videoid);
console.log(vimeo);
console.log(videoname);
console.log(videolength);
console.log(videodesc);
var videolisting = document.createElement('div');
videolisting.setAttribute('class', 'row');
videolisting.innerHTML = "<div class='col-md-6'><div class='embed-responsive embed-responsive-16by9'><iframe src='https://player.vimeo.com/video/" + vimeo + "' frameborder='0' webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></div><div class='col-md-6'><h3>" + videoname + "</h3><small>" + videolength + "</small><p>" + videodesc + "</p></div><hr>";
document.getElementById("container").appendChild(videolisting);
});
});
});
});发布于 2018-03-12 05:53:41
我建议您重新构建数据库,如下所示
users
-cvbnm876567890
- emeil : 'email@email.com'
- name : 'user name'
- pvideos
-fghjk098u6sgs78d80s
-desc : 'description'
-vimeo : 'vimeo_link'
-name : 'name'
-length : 'length'
-category : 'category'
-oiu345ytrdfghj67890
-desc : 'description'
-vimeo : 'vimeo_link'
-name : 'name'
-length : 'length'
-category : 'category'
videos
- videokey1
- category : "Walking Series"
- videokey2
- category : "Running Series"
videos_categories
- Walking Series
- Running Series您可以使用db.child('videos').orderByChild('category').equalTo('Walking Series')获取单个类别或系列的视频。您可以将查询修改为如下所示
var series = db.child('videos_categories').orderByKey();
series.once('value').then(function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var videoseries = childSnapshot.key;
console.log(videoseries);
var category_wrapper = document.createElement('div');
category_wrapper.setAttribute('class', 'row');
category_wrapper.setAttribute('id', videoseries);
document.getElementById("container").appendChild(category_wrapper);
var seriesheading = document.createElement('h3');
seriesheading.textContent = videoseries;
seriesheading.setAttribute('class', 'bg-color-2');
document.getElementById(videoseries).appendChild(seriesheading);
});
}).then(() => {
var videodata = db.child('videos').orderByChild('category');
videodata.once('value').then(function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var videoid = childSnapshot.key;
var vimeo = childSnapshot.child('vimeo').val();
var videoname = childSnapshot.child('name').val();
var videolength = childSnapshot.child('length').val();
var videodesc = childSnapshot.child('desc').val();
var video_category = childSnapshot.child('category').val();
console.log(videoid);
console.log(vimeo);
console.log(videoname);
console.log(videolength);
console.log(videodesc);
var videolisting = document.createElement('div');
videolisting.setAttribute('class', 'row');
videolisting.innerHTML = "<div class='col-md-6'><div class='embed-responsive embed-responsive-16by9'><iframe src='https://player.vimeo.com/video/" + vimeo + "' frameborder='0' webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></div><div class='col-md-6'><h3>" + videoname + "</h3><small>" + videolength + "</small><p>" + videodesc + "</p></div><hr>";
document.getElementById(video_category).appendChild(videolisting);
});
});
});在firebase中,数据的非规范化是很重要的。因此,您可以按照希望数据在视图中显示的方式保存数据。
您不需要将有关该视频的所有信息都添加到用户节点。列出视频时需要的详细信息,然后在获取一个视频时从视频节点获取
我希望这能帮到你。如果你找到了更好的方法,请分享。
发布于 2018-03-12 09:35:54
@hazelcodes,感谢您的帮助。虽然我是在三个星期前请求帮助的,但我已经弄清楚了。尽管如此,我还是很感激。关于你的声明
“你不需要把关于该视频的所有信息都添加到用户节点。只需要在列出视频时需要的详细信息,然后在获取一个视频时从视频节点获取。”
这实际上就是我最终要做的。我完全从用户信息中提取了‘pvideo’,并将其作为自己的对象。我现在有三个独立的对象节点。一个是“用户”,一个是“视频”,第三个是“pvideos”(每个用户都购买了视频),就像这样。
users
abcde (uid)
name: Joe
email: joe@joe.com
...
videos
1234 (videoid)
name: An Awesome Video
...
5678 (videoid)
name: Another Rad Video
...
pvideos
abcde (uid)
5678 (videoid)
orderid: 99999999通过这种方式,我能够检查用户从‘pvideo’购买了哪些视频,并仅在‘video’中显示匹配视频的信息。
当用户购买新视频时,它将被添加为'pvideos/uid‘的子级。如果用户的uid不是'pvideos‘的子集,那是因为他们没有购买任何视频。一旦他们购买了他们的第一个视频,相应的孩子就被创建了。
至于分类,我决定,因为目前所有的视频都属于一个分类,所以我暂时不会使用这个分类。然而,当我到了需要额外分类的地步时,这是一个我会有的问题。在你回答了这个问题之后,我现在知道该如何在时机成熟时实现它了。
https://stackoverflow.com/questions/48846979
复制相似问题