jjzjj

c# - Mongo.net - BypassDocumentValidation 不工作

coder 2023-11-03 原文

我正在尝试在 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/

有关c# - Mongo.net - BypassDocumentValidation 不工作的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  5. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  6. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  9. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐