0

我正在使用 Compass 的验证选项卡手动输入下面的 $jsonSchema 验证。不幸的是,它一直显示错误“未知 $jsonSchema 关键字:几何”

不确定为什么会显示此错误,因为几何图形被用作键。

请对我如何纠正这个问题有任何建议吗?

{
  $jsonSchema: {
    bsonType: "object",
    required: ["properties.Name", "properties.Country", "geometry.type", "geometry.coordinates"],
    properties:{
      Country: {
        bsonType: "string",
        description: "Must be supplied"
      },
      Name: {
        bsonType: "string",
        description: "Must be supplied"
      },
      description: {
        bsonType: "string",
        description: "Optional description"
      }
    },
    geometry: {
      type: {
        bsonType: "string",
        enum: ["Point"],
        description: "Must be Point"
      },
      coordinates: {
        bsonType: ["double"],
        description: "Longitude, Latitude"
      }
    },
    datePosted: {
      bsonType: "date",
      description: "Auto-added field"
    },
    image: {
      bsonType: "string",
      description: "URL of image location"
    }
  }
}
4

2 回答 2

1

您提供的 JSON 模式看起来不太正确。关于未知“几何”关键字的错误是因为该属性应该描述您的属性之一。JSON Schema 文件的结构是严格的,并且遵循严格的(但令人困惑的)规范。

我发现您提供的架构有一些问题:

  1. 属性数组required应列出 properties对象中的键。所以在你的情况下,它应该是这样的 required: ["Name", "Country", "geometry"]
  2. geometry和对象需要放置在datePosted对象内部。imageproperties
  3. 对象的描述geometry本身必须是另一个 JSON Schema(它是一种递归模式)。
  4. 什么是几何类型?您已将其定义为字符串和仅具有一个可能选项(“Point”)的枚举。枚举仅在您提供多个选项时才有意义,并且它们的值将取代指定的数据类型。

下面的代码在 MongoDB Compass 上进行了测试:

{
  $jsonSchema: {
    bsonType: 'object',
    required: [
      'properties.Name',
      'properties.Country',
      'geometry.type',
      'geometry.coordinates'
    ],
    properties: {
      Country: {
        bsonType: 'string',
        description: 'Must be supplied'
      },
      Name: {
        bsonType: 'string',
        description: 'Must be supplied'
      },
      description: {
        bsonType: 'string',
        description: 'Optional description'
      },
      geometry: {
        type: 'object',
        properties: {
          type: {
            'enum': [
              'Point'
            ],
            description: 'Must be Point'
          },
          coordinates: {
            bsonType: [
              'object'
            ],
            description: 'Contains Longitude, Latitude',
            properties: {
              longitude: {
                type: 'number',
                description: 'Decimal representation of longitude'
              },
              latitude: {
                type: 'number',
                description: 'Decimal representation of latitude'
              }
            }
          }
        }
      },
      datePosted: {
        bsonType: 'date',
        description: 'Auto-added field'
      },
      image: {
        bsonType: 'string',
        description: 'URL of image location'
      }
    }
  }
}

查看文档中的示例:https ://docs.mongodb.com/manual/core/schema-validation/

于 2020-02-13T04:54:25.010 回答
0

geometry 是 innerjson 对象,因此您需要提及此 innerjson 对象几何的类型:{ bsonType:'object'} 然后提及必填字段

于 2021-11-13T11:45:06.737 回答