如何通过MongoDB .NET驱动创建集合时指定JSON Schema验证?
使用MongoDB .NET驱动通过JSON Schema创建带验证的集合
当然可以!MongoDB .NET驱动完全支持用JSON Schema来指定集合的验证规则,这可比手动构建冗长的FilterDefinition清爽多了。下面给你两种实用的实现方式:
方式一:直接用JSON Schema字符串
如果你已经有写好的JSON Schema(比如从其他地方复用,或者用可视化工具生成的),直接把它解析成BsonDocument就能当作验证器使用,同时记得配置验证的级别和动作,确保规则生效。
示例代码
// 预先定义好的JSON Schema(针对Foo集合的规则) string fooSchema = @" { ""$jsonSchema"": { ""bsonType"": ""object"", ""required"": [""Name"", ""Age""], ""properties"": { ""Name"": { ""bsonType"": ""string"", ""description"": ""必须是非空字符串"" }, ""Age"": { ""bsonType"": ""int"", ""minimum"": 18, ""description"": ""年龄必须大于等于18"" } } } }"; // 把JSON Schema解析为BsonDocument var validatorDocument = BsonDocument.Parse(fooSchema); // 配置集合创建选项 var createOptions = new CreateCollectionOptions<Foo> { Validator = new BsonDocumentFilterDefinition<Foo>(validatorDocument), ValidationLevel = ValidationLevel.Strict, // 严格验证所有写入操作 ValidationAction = ValidationAction.Error // 验证失败时直接抛出异常阻止操作 }; // 创建带验证的集合 await db.CreateCollectionAsync("Foos", createOptions);
方式二:用驱动的JsonSchemaBuilder构建(强类型友好)
如果你不想写纯JSON字符串,也可以用驱动自带的JsonSchemaBuilder来构建Schema,这样能获得IDE的强类型提示,不容易写错:
示例代码
// 用JsonSchemaBuilder构建验证规则 var fooSchema = new JsonSchemaBuilder() .BsonType(ObjectType.Object) .Required("Name", "Age") .Properties( props => props.Add("Name", new JsonSchemaBuilder().BsonType(StringType.String).Description("必须是非空字符串")), props => props.Add("Age", new JsonSchemaBuilder().BsonType(Int32Type.Int32).Minimum(18).Description("年龄必须≥18")) ); // 配置集合选项 var createOptions = new CreateCollectionOptions<Foo> { Validator = new JsonSchemaFilterDefinition<Foo>(fooSchema), ValidationLevel = ValidationLevel.Strict, ValidationAction = ValidationAction.Error }; // 创建集合 await db.CreateCollectionAsync("Foos", createOptions);
几个关键配置说明
ValidationLevel:控制验证的严格度,Strict会验证所有插入/更新操作;Moderate只验证修改了Schema中指定字段的操作。ValidationAction:设置验证失败后的行为,Error会抛出异常阻止操作;Warn只会记录警告,但允许操作继续。
这样就能用更简洁、易维护的JSON Schema来替代冗长的FilterDefinition代码啦~
内容的提问来源于stack exchange,提问作者mortb
相关产品推荐
相关产品推荐

