简单模式的验证错误

时间:2017-07-07 03:08:46

标签: meteor mongodb-query simple-schema meteor-collection2

我正在尝试将数组插入到对象中,但我没有运气。我认为架构基于验证拒绝它,但我不确定为什么。如果我console.log(this.state.typeOfWork)并检查typeof,则说明其Object包含:

(2) ["Audit - internal", "Audit - external"]
0: "Audit - internal"
1: "Audit - external"

更新后的我的收藏包含:

"roleAndSkills": {
    "typeOfWork": []
  }

示例:Schema

roleAndSkills: { type: Object, optional: true },
  'roleAndSkills.typeOfWork': { type: Array, optional: true },
  'roleAndSkills.typeOfWork.$': { type: String, optional: true }

示例:update

ProfileCandidate.update(this.state.profileCandidateCollectionId, {
      $set: {
        roleAndSkills: {
          typeOfWork: [this.state.typeOfWork]
        }
      }
    });

3 个答案:

答案 0 :(得分:0)

typeOfWorkArray。你应该把它的价值推进其中:

$push: {
    "roleAndSkills.typeOfWork": this.state.typeOfWork
}

表示多个值:

$push: {
    "roleAndSkills.typeOfWork": { $each: [ "val1", "val2" ] }
}

mongo $push operator

mongo dot notation

答案 1 :(得分:0)

简单模式在对象或数组上的验证存在一些问题,我在最近开发的应用程序中遇到了同样的问题。

你能做什么? 好吧,我在Collections.js文件中做了什么,当你说:

typeOfWork:{
  type: Array
}

尝试添加属性blackbox:true,如下所示:

typeOfWork:{
  blackbox: true,
  type: Array
}

这将告诉您的Schema该字段正在采用数组,但忽略了进一步的验证。

我做的验证是在main.js上,为了确保我没有空数组,数据是纯文本。

这里要求的是我的更新方法,在我的情况下,我使用的对象不是数组,但它的工作方式相同。

 editUser: function (editedUserVars, uid) {
      console.log(uid);
      return Utilizadores.update(
        {_id: uid},
        {$set:{
          username: editedUserVars.username,
          usernim: editedUserVars.usernim,
          userrank: {short: editedUserVars.userrank.short,
          long: editedUserVars.userrank.long},
          userspec: {short: editedUserVars.userspec.short,
          long: editedUserVars.userspec.long},
          usertype: editedUserVars.usertype}},
        {upsert: true})

    },

这里是集合架构

UtilizadoresSchema = new SimpleSchema({
 username:{
    type: String
 },
 usernim:{
    type: String
 },
 userrank:{
    blackbox: true,
    type: Object
 },
 userspec:{
    blackbox: true,
    type: Object
 },
 usertype:{
    type: String
 }
});
Utilizadores.attachSchema(UtilizadoresSchema);

希望有所帮助

罗布

答案 2 :(得分:0)

您声明this.state.typeOfWork是一个数组(字符串),但是当您.update()文档时,您将其括在方括号中:

ProfileCandidate.update(this.state.profileCandidateCollectionId, {
  $set: {
    roleAndSkills: {
      typeOfWork: [this.state.typeOfWork]
    }
  }
});

只需删除多余的方括号:

ProfileCandidate.update(this.state.profileCandidateCollectionId, {
  $set: {
    roleAndSkills: {
      typeOfWork: this.state.typeOfWork
    }
  }
});

此外,由于您的数组只是一个字符串数组,因此您可以通过[String]为类型声明它来简化您的模式:

'roleAndSkills.typeOfWork': { type: [String] }

此外,请注意,对象和数组默认是可选的,因此您甚至可以省略可选标记。