【问题标题】:How does MongoDB use JSON Schema keyword "oneOf" for validation?MongoDB 如何使用 JSON Schema 关键字“oneOf”进行验证?
【发布时间】:2018-04-17 07:28:27
【问题描述】:

下面是定义的 json 模式。我已经测试过anyOf、oneOf、allOf。除了 oneOf 之外,模式在所有情况下都可以正常工作。理想情况下,它应该只在 oneOf 中工作。它不工作。

{
  "bsonType": "object",
  "additionalProperties": true,
  "properties": {
    "_id": {},
    "enhanced_file_url": {
      "bsonType": "string"
    },
    "child_docs": {
      "type": [
        "array"
      ],
      "items": {
        "bsonType": "object",
        "additionalProperties": true,
        "properties": {
          "_id": {},
          "standardized_data": {
            "oneOf": [
              {
                "bsonType": "object",
                "properties": {
                  "shipper__address_line_1": {
                    "bsonType": "string"
                  }
                }
              },
              {
                "bsonType": "object",
                "properties": {
                  "shipper__address_line_2": {
                    "bsonType": "double"
                  }
                }
              }
            ]
          },
          "standardized_field_prediction": {
            "bsonType": "object",
            "additionalProperties": true
          }
        }
      }
    }
  }
}

下面是json数据的输入格式。

{ 
    "enhanced_file_url" : "http://localhost:9000/documents/5ab51e99534b44180e0bdb0c/document_download", 
    "child_docs" : [
    {
        "standardized_data" : {
            "shipper__address_line_1": "A28 pariseema Complex"
        }
    },
    {
        "standardized_data" : {
            "shipper__address_line_2": "A1-63 Orchid Greenfield"
        }
    }
]}

当我们在上面运行时,它会报错

【问题讨论】:

  • 我不知道您的模式是否特定于 mongo,但对于 JSON,您需要一个小的 t 用于 true 作为一个裸词。由于将True 更改为true,然后我根据jsonschemavalidator.net 获得了有效架构,然后实例通过。
  • 错误信息是什么?
  • @Relequestual 因为我们碰巧在 Python 脚本中指定了模式,所以我们应该使用带有大写 T 的“True”
  • 谢谢。只是想我会检查。您能否更新您的问题以包含您看到的错误消息?
  • @Relequestual 它没有显示任何错误。当我们使用“allOf”/“anyOf”时,数据被插入(正确验证),而文档在“oneOf”上验证失败

标签: json mongodb pymongo jsonschema json-schema-validator


【解决方案1】:

要针对oneOf 进行验证,给定数据必须对恰好一个给定子模式有效。

您尝试插入的子文档满足您在 oneOf 字段中提供的两个条件,因为它们是对象:

child_docs[0] 满足两者 oneOf[0]oneOf[1]因为它是一个对象

所以你应该改用anyOf

【讨论】:

  • 请添加更多解释。你是在暗示读者知道:To validate against oneOf, the given data must be valid against *exactly one* of the given subschemas.
  • 我不确定它究竟为什么会这样......spec 似乎说,如果两个对象的值相等(包括属性的名称),则它们是相等的。是 mongodb 实现偏离了那个还是我错过了什么?
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多