将新验证程序添加到现有集合

时间:2017-06-01 22:41:13

标签: mongodb mongodb-query

我尝试将新字段(Date类型的LastLoginDate)添加到现有集合中。这是我的示例脚本:

db.createCollection( "MyTestCollection",
   { "validator": { "$or":
       [
          { "username": { "$type": "string" } },
          { "notes": { "$type": "string" } }
       ]
    }
   }
)

db.getCollectionInfos({name: "MyTestCollection"});
  [
     {
        "name" : "MyTestCollection",
        "options" : {
           "validator" : {
              "$or" : [
                 {
                    "username" : {
                       "$type" : "string"
                    }
                 },
                 {
                    "notes" : {
                       "$type" : "string"
                    }
                 }
              ]
           }
        }
     }
  ]

将新字段LastLoginDate : { $type: "date" }添加到此现有集合" MyTestCollection"的最佳方式是什么。

使用新字段添加新文档或更新现有集合可能会创建此字段。但我不确定如何在新字段上强制执行日期类型。添加新字段后,如果我再次执行以下命令,则不会为新添加的字段显示类型验证器。

2 个答案:

答案 0 :(得分:12)

我"应该"可能在你的问题中以一个误解为前缀。事实上,MongoDB与传统的RDBMS的不同之处在于它是无模式的#34;而你实际上并不需要"创建字段"一点都不所以这不同于"表模式"在架构发生变化之前,您无法执行任何操作。 "验证"然而,这是一个不同的东西,还有一个"仍然"写作时相对较新的特点。

如果您想要"添加验证规则" ,那么有些方法取决于集合的当前状态。在任何一种情况下,实际上都没有"添加到"功能,但行动反而是"替换" 全部验证规则,并指定新的验证规则。继续阅读有关其工作原理的规则。

现有文件

集合中有现有文档,如documentation

中所述
  

现有文件

     

您可以使用 validationLevel 选项控制MongoDB处理现有文档的方式。

     

默认情况下, validationLevel 严格,MongoDB会将验证规则应用于所有插入和更新。将 validationLevel 设置为中等会将验证规则应用于插入和更新符合验证条件的现有文档。使用中等级别,不会检查不符合验证条件的现有文档的更新是否有效。

本节和下面的示例部分基本上说除了.createCollection()上的选项之外,您还可以使用文档修改现有集合,但应该谨慎对待"本文件可能不符合规定的要求。因此,如果您不确定该集合中所有文档的规则是否符合,请使用"中等"

为了申请,您目前使用.runCommand()方法发出"命令"它设置验证规则。从上面的段落中可以看出" validationLevel"

由于您有现有规则,我们可以使用`.getCollectionInfos()检索它们,然后添加新规则并应用:

let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

validator.$or.push({ "LastLoginDate": { "$type": "date" } });

db.runCommand({
  "collMod": "MyTestCollection",
  "validator": validator,
  "validationLevel": "moderate"
});

当然,如前所述,如果您确信所有文件都符合条件,那么您可以将" strict" 作为默认值。

空集合

如果在这种情况下,该集合实际上是#34;空的"没有任何文件你可以"掉落"由于当前数据不重要,因此您可以简单地改变上述内容并将.createCollection().drop()结合使用:

let validatior = db.getCollectionInfos({name: "MyTestCollection"})[0].options.validator;

validator.$or.push({ "LastLoginDate": { "$type": "date" } });

db.getCollection("MyTestCollection").drop();

db.createCollection( "MyTestCollection", { "validator": validator });

答案 1 :(得分:1)

let previousValidator = db.getCollectionInfos({name: "collectionName"})[0].options.validator;
# push the key to required array
previousValidator.$jsonSchema.required.push("isBloodReportAvailable")

let isBloodReportAvailabl = {"bsonType" : "bool", "description" : "must be an bool object and is optional" }
# add new property to validator
previousValidator1.$jsonSchema.properties['isBloodReportAvailable'] = isBloodReportAvailabl

db.runCommand({
  "collMod": "collectionName",
  "validator": previousValidator,
});