gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:47:58 25 4
gpt4 key购买 nike

我有一个相当大的 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/

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