【问题标题】:Meteor Collection Design流星系列设计
【发布时间】:2015-06-17 22:18:17
【问题描述】:

我正在开发一个流星应用程序,在该应用程序中,用户会看到在某个场地表演的音乐会列表。然后用户可以选择他/她是否想在那个晚上工作。我已经到了一个用户可以使用它的阶段,但我正在努力如何设置集合以允许多个用户使用该应用程序。我需要它保持原始集合保持不变以供未来用户查看,但每个用户都应该能够更改数据,然后将这些数据保存到每个用户在该特定月份的集合中。

我将非常感谢任何帮助,因为这阻碍了我完成项目。我很乐意以任何方式更改我的代码以支持此功能,因为这是应用程序最重要的标准。

我正在使用 reactiveTable meteor 包来显示集合中的数据,因此我想保留集合中的数据,同时能够制作集合中文档的副本。

这就是我在页面上显示表格的方式:
{{> reactiveTable 集合=表设置=设置}}

感谢您提供的任何帮助。

【问题讨论】:

    标签: javascript mongodb collections meteor


    【解决方案1】:

    您应该看看 Meteor 的 account system,它允许用户使用他们的电子邮件或社交服务(Facebook 等)登录。它非常易于使用。

    使用已登录的用户,您将获得一个 ID(带有 Meteor.userId()),您可以将其添加到集合的文档中,如下所示:

    //insert a new item belonging to a user    
    MyCollection.insert({title: 'blahblah', userId: Meteor.userId()});
    

    使用这样的用户 ID,您可以过滤要显示的已发布数据,并仅授权当前 ID 对应于文档 ID 的用户。

    出版物示例:

    Meteor.publish('userDocumentsOnly', function() {
      return MyCollection.find({userId: this.userId}); //note that inside publications you can only use this.userId and not directly Meteor.userId()
    });
    

    更新示例:

    MyCollection.update({userId: Meteor.userId()}, {$set: {title: '...'}});
    

    【讨论】:

    • 如何让每个用户订阅他们自己的集合,但如果他们没有任何现有数据要订阅,也订阅空白数据?我目前每个月都有一个单独的集合,表中的每一行都显示集合中的一个文档。这是最好的方法还是我应该使用更好的设计?
    • 我认为每个用户拥有一个集合并不是最好的设计,但是拥有一个包含他们所属的用户 ID 的文档集合是过滤您的出版物的最佳方式。然后,您只需按 userId 进行选择或检查文档是否属于当前用户。关于空白数据集,您可以让此类文档的 userId 为空白,并在查询中使用 $or 选择器来获取当前用户的文档和空白文档 `{$or: [ {userId: ''}, {userId: Meteor.用户 ID()}] }
    • 我已将代码更改为只有一个集合,并按照您建议的方式发布。如何使原始文档以其原始状态保存,同时也为当前用户保存,而不会将两个文档都显示给用户,因为它们都将被发布。对吗?
    • 如果我理解您想为您的用户使用空白文档作为“模板”,然后只保存修改后的版本?但是随后您的数据库中将有两个类似的文档。也许最好在 Meteor 模板中硬编码“默认”值,这样它们就不会保存在数据库中。
    • 似乎这将是唯一的方法。我希望避免这种情况,因为我正在使用从集合创建表的包。硬编码的数据会不会继续显示?
    【解决方案2】:

    我认为这是可行的几种方式:

    1. 为您的用户集合中的每个用户文档都有一个对象数组,用于存储音乐会 ID 和他们将工作的日期。这样做的缺点是随着时间的推移,您将拥有可变增长的数组,is not ideal

    看起来像:

    {
       _id: AwAHjraVBa,
       userConcerts: [ {concertId: QthahAHtaE, dateWorked: 2015-10-10} ]
    }
    
    1. 创建一个单独的集合,将音乐会的 ID 和用户的 ID 以及他们当晚工作的日期存储为每个文档。

    它可能看起来像:

    {
       userId: AwAHjraVBa,
       concertId: QthahAHtaE,
       dateWorked: 2015-10-10
    }
    

    我可能会选择第二个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多