gpt4 book ai didi

c# - Mongo.net - BypassDocumentValidation 不工作

转载 作者:可可西里 更新时间:2023-11-01 10:09:06 27 4
gpt4 key购买 nike

我正在尝试在 Net Core 控制台项目中插入这样的 json(带有“.”的字段名)

{"name.field" : "MongoDB", "type" : "Database"}

使用亲爱的 C# 代码:

-InsertManyOptions 和 BypassDocumentValidation 为 true

var options = new InsertManyOptions
{
BypassDocumentValidation = true,
IsOrdered = false
};


await _collection.InsertManyAsync(items, options);

但我有这个异常(exception):

元素名称“name.field”无效

我正在使用:

  • C# Mongo 驱动程序 2.5
  • 网络核心项目
  • MongoDB 版本 4.0.3

有什么想法吗?谢谢!

最佳答案

BypassDocumentValidation 可用于绕过 JSON Schema validation .但是,您面临的问题是由于 C# 驱动程序明确阻止使用点符号 . 作为字段名称的一部分。

这在 MongoDB v3.6 之前一直是必需的 officially added support对于带有“.”的字段。

查看 C# 驱动程序的内部结构,您可以看到 BsonWriter.WriteName 方法调用包含抛出您所看到的异常的代码:

if (!_elementNameValidator.IsValidElementName(name))
{
var message = string.Format("Element name '{0}' is not valid'.", name);
throw new BsonSerializationException(message);
}

_elementNameValidator 是由驱动程序内部管理的东西,它实际上带有一个不进行任何验证的 NoOpElementNameValidator。然而,驱动程序不会将此验证器用于“正常”集合。

总而言之,无论如何我都强烈建议不要使用带有“不寻常”字符的字段名称,因为这可能会让您遇到意外行为和各种其他问题。

为了解决这个问题,您可以执行以下操作之一:

a) 编写您自己的自定义序列化程序,如果可能的话,我个人会尽量避免这种选择 - 它增加了大多数情况下不需要的复杂性。

b) 使用下面的帮助程序扩展(从驱动程序中的一个单元测试项目复制)将 BsonDocument 转换为 RawBsonDocument 然后可以成功写入服务器:

public static class RawBsonDocumentHelper
{
public static RawBsonDocument FromBsonDocument(BsonDocument document)
{
using (var memoryStream = new MemoryStream())
{
using (var bsonWriter = new BsonBinaryWriter(memoryStream, BsonBinaryWriterSettings.Defaults))
{
var context = BsonSerializationContext.CreateRoot(bsonWriter);
BsonDocumentSerializer.Instance.Serialize(context, document);
}
return new RawBsonDocument(memoryStream.ToArray());
}
}

public static RawBsonDocument FromJson(string json)
{
return FromBsonDocument(BsonDocument.Parse(json));
}
}

然后简单地将 RawBsonDocument 写入服务器:

RawBsonDocument rawDoc = RawBsonDocumentHelper.FromJson("{\"name.field\" : \"MongoDB\", \"type\" : \"Database\"}");
collection.InsertOne(rawDoc);

关于c# - Mongo.net - BypassDocumentValidation 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52976179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com