草庐IT

尽管类型正确,json 模式验证仍失败

coder 2023-10-31 原文

我有一个相当大的 json 模式。有问题的部分是架构中称为“翻译”的较小架构,看起来像这样:

"translations": {
    "bsonType": "object",
    "patternProperties": {
        "id": {
            "bsonType": "string"
        },
        "^[a-z]{2}$": {
            "anyOf": [
                {
                    "bsonType": "object"
                },
                {
                    "bsonType": "array"
                }
            ]
        }
    }
}

其中正则表达式定义的对象包含更多属性(例如,一个名为“文本”的字段),数组是这些对象的数组,但我只留下了对理解结构很重要的部分。

我的问题是,当我根据这个模式验证我的文件时,它每一个都失败了,但是当我从 anyOf 数组中的第一个对象中删除“bsonType”:“object”时,它工作正常。

我的所有文件都是这样的,即翻译对象中至少有一个对象是“对象”类型,它以正则表达式作为键。所以我不明白为什么他们会失败。

我使用的是 mongoDB 3.6.0。

这是一个失败的文件示例:

 "translations":{  
    "id":"12345",
    "br":{  
       "text":"string1"
    },
    "en":{  
       "text":"string2"
    },
    "ja":[  
       {  
          "text":"string3"
       },
       {  
          "text":"string4"
       }
    ],
    "no":[  
       {  
          "text":"string6"
       },
       {  
          "text":"string7"
       }
    ]
 }

如果不清楚 - 问题是当在 anyOf 数组的第一个对象中使用“bsonType”定义架构时,像这样的文件会失败:“object”,并且在我取消它时工作。 anyOf 数组的第二个对象中的 "bsonType": "array"工作正常。

最佳答案

我认为你的问题是 id 与正则表达式冲突试试这个:

let MongoClient = require('mongodb').MongoClient;

let collectionName = 'translations';

let scheme =  {
    $jsonSchema:{
        "bsonType": "object",
        "patternProperties": {
            "^id$":{
                "bsonType":"string"
            },
            "^(?!id)([a-z]{2})$": {
                "anyOf": [
                    {
                        "bsonType": "object"
                    },
                    {
                        "bsonType": "array"
                    }
                ]
            }
        },
    }
};

let goodJson ={
    "id": "12345",
    "br":{
        "text":"string1"
    },
    "en":{
        "text":"string2"
    },
    "ja":[
        {
            "text":"string3"
        },
        {
            "text":"string4"
        }
    ],
    "no":[
        {
            "text":"string6"
        },
        {
            "text":"string7"
        }
    ]
};

let badJson ={
    "id": "12345",
    "br":{
        "text":"string1"
    },
    "en":{
        "text":"string2"
    },
    "ja":[
        {
            "text":"string3"
        },
        {
            "text":"string4"
        }
    ],
    "no":[
        {
            "text":"string6"
        },
        {
            "text":"string7"
        }
    ],
    "nt": "not_object_or_array"
};

async function run() {
    let db = await MongoClient.connect('mongodb://localhost:27017/exampleDb');
    let dbo = db.db('mydb');
    let collections = await dbo.collections();
    let collectionsNames = collections.map(c => c.s.name);
    if (collectionsNames.includes(collectionName)) {
        console.log('dropping collection');
        await dbo.collection(collectionName).drop();
    }
    console.log('creating collection');
    await dbo.createCollection(collectionName,  {validator: scheme});
    let translationCollection = dbo.collection(collectionName);
    console.log('this will validate successfully');
    await translationCollection.insertOne(goodJson);
    console.log('this will raise validation error because: "nt": "not_object_or_array"');
    try {
        await translationCollection.insertOne(badJson);
    } catch(error) {
        console.log(error);
    }
    await db.close();
}
run();

关于尽管类型正确,json 模式验证仍失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473242/

有关尽管类型正确,json 模式验证仍失败的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  6. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  7. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  10. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

随机推荐