首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firebase数据库网站

Firebase数据库网站
EN

Stack Overflow用户
提问于 2018-02-18 07:37:13
回答 2查看 76关注 0票数 0

我在尝试解决这个问题时遇到了一些问题。我来自SQL背景,是Firebase数据库的新手。我正在建立一个网站,出售个人在线视频。我想要做的事情看起来很简单,但我无论如何也做不到。

我想要显示一个页面,其中只列出了用户已购买的视频,而不是整个可用的视频列表。显然,因为我只想让用户访问他们所购买的内容。目前,我可以显示所有视频的列表和每个类别的类别标题。我不知道如何限制这个列表,使其只显示用户购买的视频。

这是我的数据库结构

正如你所看到的,我把视频和他们的信息放在" videos“集合中,把用户放在" users”集合中。在每个用户的下面是一个"pvideos“集合,它显示了用户购买的每个视频的id。

我如何写这篇文章来限制列表只匹配用户购买的视频有什么想法吗?

包含的代码显示所有可用视频的分类标题和视频(当前),而不考虑购买状态。

代码语言:javascript
运行
复制
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);
                                        });
                                    });
                            });
                    });
EN

回答 2

Stack Overflow用户

发布于 2018-03-12 05:53:41

我建议您重新构建数据库,如下所示

代码语言:javascript
运行
复制
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')获取单个类别或系列的视频。您可以将查询修改为如下所示

代码语言:javascript
运行
复制
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中,数据的非规范化是很重要的。因此,您可以按照希望数据在视图中显示的方式保存数据。

您不需要将有关该视频的所有信息都添加到用户节点。列出视频时需要的详细信息,然后在获取一个视频时从视频节点获取

我希望这能帮到你。如果你找到了更好的方法,请分享。

票数 0
EN

Stack Overflow用户

发布于 2018-03-12 09:35:54

@hazelcodes,感谢您的帮助。虽然我是在三个星期前请求帮助的,但我已经弄清楚了。尽管如此,我还是很感激。关于你的声明

“你不需要把关于该视频的所有信息都添加到用户节点。只需要在列出视频时需要的详细信息,然后在获取一个视频时从视频节点获取。”

这实际上就是我最终要做的。我完全从用户信息中提取了‘pvideo’,并将其作为自己的对象。我现在有三个独立的对象节点。一个是“用户”,一个是“视频”,第三个是“pvideos”(每个用户都购买了视频),就像这样。

代码语言:javascript
运行
复制
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‘的子集,那是因为他们没有购买任何视频。一旦他们购买了他们的第一个视频,相应的孩子就被创建了。

至于分类,我决定,因为目前所有的视频都属于一个分类,所以我暂时不会使用这个分类。然而,当我到了需要额外分类的地步时,这是一个我会有的问题。在你回答了这个问题之后,我现在知道该如何在时机成熟时实现它了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48846979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档