【问题标题】:Meteor Collections and when to use a schemaMeteor 集合以及何时使用模式
【发布时间】:2015-09-09 23:40:30
【问题描述】:

我开始构建一个应用程序并拥有一个用于创建宠物帖子的集合。

注意:我正在使用以下包来构建我的集合模式,简单模式https://atmospherejs.com/aldeed/simple-schema

我用来将数据插入此特定集合的页面有一个部分,该部分基于用户做出的选择,为他们提供了更多选项。

例如,专注于一个问题,有一些复选框,默认情况下没有选中,但如果用户选择任何复选框,他们将获得更多选项,可以通过复选框或文本区域进行选择。关键是他们将根据自己的选择有其他选项可供选择。

我认为处理数据插入方式的最佳方法是通过特定部分的模板助手,所以这不是问题。

相反,我感到困惑的是集合级别以及如何架构该信息,或者我什至需要。

例如,假设您有一个涉及宠物的问题。

问题可能是:你有宠物吗?

复选框选项可以是:

  1. 其他

默认情况下,所有这些复选框都未选中,但如果用户选中任何一个框,则会显示一个文本区域(我再次意识到所有这些都发生在 Template.events 和 Template.helpers 级别)。

既然我已经设置了场景,我真正的问题是,你如何存储这样的信息或架构它以允许这些类型的值。

假设获取这些数据的所有函数都在 Template.helpers 级别,所以这是一个关于如何在这种情况下存储类型数据的简单问题。

我的想法是做这样的事情(使用 simpleSchema 包):

Pet = new SimpleSchema({
 petInstructions: {
  type: String,
  optional: true,
  allowedValues: ['Dogs', 'Cats', 'Other']    
 }
});

但是我不确定这是否正确,让我再次重申,我确实希望复选框具有值“狗”、“猫”、“其他”和文本区域,当其中任何一个被选中时最终用户可以输入有关其宠物的更多信息。

我不清楚的是,我是否在考虑这些数据的 Schema 可能是什么,或者这种信息应该如何存储在 MongoDB 中。

我觉得 TextArea 输入也应该有一个属性,这是考虑它的好方法吗?

例如(添加到上面的示例):

Pet = new SimpleSchema({
     petInstructions: {
      type: String,
      optional: true,
      allowedValues: ['Dogs', 'Cats', 'Other'],
      textArea: ""
     }
    });

我是否应该为该特定内容保留另一个属性/值?

这是一个有点细粒度的问题,理解像这样简单的事情将有助于澄清我的其他问题。

谢谢。

【问题讨论】:

    标签: javascript mongodb checkbox meteor collections


    【解决方案1】:

    这就是我的结构。这是关于如何根据另一个字段验证一个字段以及如何有条件地要求一个值的 autoform 说明 - https://github.com/aldeed/meteor-simple-schema#best-practice-code-examples

    Pet = new SimpleSchema({
      pet: {
        type: Object,
        optional: true
      },
      "pet.type": {
        type: String,
        optional: true,
        allowedValues: ['Dogs', 'Cats', 'Other']
      },
      "pet.instructions": {
        type: String,
        optional: true,
        custom: function(){
            var petType = this.field('pet.type').value;
            // if the user selects a pet type then instructions should be required
            if (petType){
                return "required";
            };
        }
      }
    });
    

    在您的旧代码中:

    Pet = new SimpleSchema({
         petInstructions: {
          type: String,
          optional: true,
          allowedValues: ['Dogs', 'Cats', 'Other'],
          textArea: ""
         }
        });
    

    您实际上是在说明对于 petInstructions 键,您只允许值是 Dogs、Cats 或 Other,但您还希望其中一个键是 textArea 和一些其他数据,这不会太多的意义。 SimpleSchema 希望您为 每个 键定义一个特定的数据点。

    【讨论】:

    • 完全有道理我看到我的错误,正如你提到的,只关注宠物指令;而您首先正确地将宠物声明为对象,然后为每种其他类型的输入数据创建单独的键:值对。太好了,谢谢你的澄清。
    • 是的。定义每一个都可能很乏味。单身的。片。的。数据。在您的架构中,但这就是架构通常如何工作以保持数据一致性。您也会在 SQL 模式中发现同样的死板。仅供参考,如果您不想定义对象内的所有内容,则简单模式具有 blackbox 值。
    猜你喜欢
    • 2011-05-16
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2014-10-10
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多