mongodb - 将新验证器添加到现有集合

标签 mongodb mongodb-query

我正在尝试将新字段(日期类型的 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"
                    }
                 }
              ]
           }
        }
     }
  ]

向现有集合“MyTestCollection”添加新字段 LastLoginDate : { $type: "date"} 的最佳方法是什么。

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

最佳答案

我“应该”可能在您的问题中加上一个误解作为前缀。事实上,MongoDB 与传统 RDBMS 的不同之处在于它是“无模式”的,实际上您根本不需要“创建字段”。所以这不同于“表模式”,在模式更改之前你不能做任何事情。然而,“验证”是另一回事,并且在撰写本文时“仍然”是一个相对较新的功能。

如果您想“添加验证规则”,则有一些方法取决于集合的当前状态。在任何一种情况下,实际上都没有“添加到”功能,而是用要指定的新规则“替换”所有验证规则。继续阅读以了解其工作原理。

现有文件

documentation 中所述,集合中包含现有文档的位置

Existing Documents

You can control how MongoDB handles existing documents using the validationLevel option.

By default, validationLevel is strict and MongoDB applies validation rules to all inserts and updates. Setting validationLevel to moderate applies validation rules to inserts and to updates to existing documents that fulfill the validation criteria. With the moderate level, updates to existing documents that do not fulfill the validation criteria are not checked for validity.

这个和下面的示例部分基本上是说,除了 .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”作为默认值。

空集合

如果在这种情况下,集合实际上是“空的”,根本没有任何文档或者您可能会“丢弃”集合,因为当前数据并不重要,那么您可以简单地改变上面的内容并结合使用 .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 });

关于mongodb - 将新验证器添加到现有集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46697359/

相关文章:

mongodb - 如何更改分片键

mongodb - 如何扩展定制的分析引擎?

mongodb - 更新双嵌套数组mongodb

MongoDB - 检查文档中的字段是否存在值

mongodb - 使用更新查询将文档值从字符串更改为 ObjectId

mongodb - 在 mongo 中创建条件 TTL

java - 如何在 Spring Data Mongodb 中进行 GroupBy 而不进行聚合?

javascript - 无法使用 Meteor 1.3 从 NPM 插入集合

arrays - 仅当它是插入时如何推送数组元素

mongodb - Mongodb - 过滤嵌套数组中的数据元素