AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 203926
Accepted
Joey Yi Zhao
Joey Yi Zhao
Asked: 2018-04-14 19:02:18 +0800 CST2018-04-14 19:02:18 +0800 CST 2018-04-14 19:02:18 +0800 CST

Como encontrar todos os documentos inválidos com base no validador jsonSchema?

  • 772

Um dos novos recursos do MongoDB 3.6 é o validador jsonSchema. Eu posso criar uma coleção com um validador como:

{
  "validator": {
    "$jsonSchema": {
      "properties": {
        "name": {
          "bsonType": "string",
          "description": "name"
        },
        "age": {
          "bsonType": "int",
          "minimum": 10,
          "maximum": 30
        }
      },
      "required": ["name", "age"],
      "bsonType": "object"
    }
  }
}

Mas e se a coleção já existisse com alguns documentos, que não preenchem o esquema de validação? Como posso descobrir todos os documentos inválidos com base no validador?

mongodb mongodb-3.6
  • 2 2 respostas
  • 1821 Views

2 respostas

  • Voted
  1. Best Answer
    Stennie
    2018-04-15T03:22:42+08:002018-04-15T03:22:42+08:00

    Você pode usar o $jsonSchemaoperador de consulta para localizar documentos relevantes.

    Por exemplo, usando o mongoshell:

    // Retrieve the current validator for the "students" collection
    var schema = db.getCollectionInfos({ name: "students" })[0].options.validator
    
    // Find any documents not matching the schema
    db.students.find({ $nor: [schema] })
    

    Da mesma forma, você pode usar o $jsonSchemaoperador de consulta para confirmar as correspondências esperadas antes de adicionar ou atualizar o validador de uma coleção:

    var schema = {
      $jsonSchema: {
        properties: {
          name: {
            bsonType: "string",
            description: "name",
          },
        },
        required: ["name"],
        bsonType: "object",
      },
    }
    
    // Find documents matching schema
    db.students.find(schema)
    
    • 3
  2. Md Haidar Ali Khan
    2018-04-15T05:39:11+08:002018-04-15T05:39:11+08:00

    Conforme MongoDBdocumentado aqui Para especificar a validação do esquema JSON, use o operador $jsonSchema na expressão do validador.

    Por exemplo, o exemplo a seguir especifica regras de validação usando JSONesquema:

    db.createCollection("students", {
       validator: {
          $jsonSchema: {   --- jsonSchema validation
             bsonType: "object",
             required: [ "name", "year", "major", "gpa" ],
             properties: {
                name: {
                   bsonType: "string",
                   description: "must be a string and is required"
                },
                gender: {
                   bsonType: "string",
                   description: "must be a string and is not required"
                },
                year: {
                   bsonType: "int",
                   minimum: 2017,
                   maximum: 3017,
                   exclusiveMaximum: false,
                   description: "must be an integer in [ 2017, 3017 ] and is required"
                },
                major: {
                   enum: [ "Math", "English", "Computer Science", "History", null ],
                   description: "can only be one of the enum values and is required"
                },
                gpa: {
                   bsonType: [ "double" ],
                   minimum: 0,
                   description: "must be a double and is required"
                }
             }
          }
       }
    })
    

    Ou como posso ver em seu código, a validação do jsonSchema.

    "validator" : {
                    "$jsonSchema" : {  ---jsonSchema
                        "properties" : {
                            "name" : {
                                "bsonType" : "string",
                                "description" : "name"
                            },
                            "age" : {
                                "bsonType" : "int",
                                "minimum" : 10,
                                "maximum" : 30
                            }
                        },
                        "required" : [
                            "name",
                            "age"
                        ],
                        "bsonType" : "object"
                    }
                }
    

    Além da validação do esquema JSON, o MongoDB oferece suporte à validação com expressões de filtro de consulta usando os operadores de consulta , com exceção de $near , $nearSphere , $text e $where .

    mas e se a coleção já existir com alguns documentos não preencherem o creterial de validação?

    A validação ocorre durante updatese inserts. Quando você adiciona validação a uma coleção, os documentos existentes não passam por verificações de validação até a modificação.

    Para documentos existentes

    A validationLevelopção determina quais operações o MongoDB aplica as regras de validação:

    1. Se validationLevelfor strict(o padrão), o MongoDB aplica regras de validação a todas as inserções e atualizações.
    2. Se validationLevelfor moderate, o MongoDB aplica regras de validação para inserções e atualizações de documentos existentes que já atendem aos critérios de validação. Com o nível moderado, as atualizações de documentos existentes que não atendem aos critérios de validação não são verificadas quanto à validade.

    Por exemplo, crie uma coleção de contatos com os seguintes documentos:

    db.contacts.insert([
       { "_id": 1, "name": "Anne", "phone": "+1 555 123 456", "city": "London", "status": "Complete" },
       { "_id": 2, "name": "Ivan", "city": "Vancouver" }
    ])
    

    Emita o seguinte comando para adicionar um validatorà coleção de contatos:

    db.runCommand( {
       collMod: "contacts",
       validator: { $jsonSchema: { --- jsonSchema validation
          bsonType: "object",
          required: [ "phone", "name" ],
          properties: {
             phone: {
                bsonType: "string",
                description: "must be a string and is required"
             },
             name: {
                bsonType: "string",
                description: "must be a string and is required"
             }
          }
       } },
       validationLevel: "moderate"   --- validationLevel moderate , With the moderate level, updates to existing documents that do not fulfill the validation criteria are not checked for validity
    } )
    

    A coleção de contatos agora tem um validador com o nível de validação moderado:

    Se você tentasse atualizar o documento com _id, 1o MongoDB aplicaria as regras de validação, pois o documento existente corresponde aos critérios. Por outro lado, o MongoDB não aplicará regras de validação para atualizações do documento com _id, 2pois ele não atende às regras de validação.

    Para desabilitar validation entirely, você pode definir validationLevelcomo off.

    Como posso descobrir todos os documentos inválidos com base no validador?

    Para aceitar ou rejeitar documentos inválidos

    A validationActionopção determina como o MongoDB lida com documentos que violam as regras de validação:

    1. Se validationActionfor error(o padrão), o MongoDB rejeita qualquer inserção ou atualização que viole os critérios de validação.
    2. Se validationActionfor warn, o MongoDB registra quaisquer violações, mas permite que a inserção ou atualização continue.

    Por exemplo, crie uma contacts2coleção com o seguinte validador de esquema JSON:

    db.createCollection( "contacts2", {
       validator: { $jsonSchema: {  ---jsonSchema validation
          bsonType: "object",
          required: [ "phone" ],
          properties: {
             phone: {
                bsonType: "string",
                description: "must be a string and is required"
             },
             email: {
                bsonType : "string",
                pattern : "@mongodb\.com$",
                description: "must be a string and match the regular expression pattern"
             },
             status: {
                enum: [ "Unknown", "Incomplete" ],
                description: "can only be one of the enum values"
             }
          }
       } },
       validationAction: "warn"  --- validationAction is warn, MongoDB logs any violations but allows the insertion or update to proceed.
    } )
    

    Com o , o MongoDB registra quaisquer violações, mas permite que a inserção ou atualização prossiga.warn validationAction

    Por exemplo, a seguinte operação de inserção viola a regra de validação:

    db.contacts2.insert( { name: "Amanda", status: "Updated" } )
    

    No entanto, como o validationActionis warnonly, o MongoDB apenas registra a mensagem de violação de validação e permite que a operação continue:

    2017-12-01T12:31:23.738-0500 W STORAGE  [conn1] Document would fail validation collection: example.contacts2 doc: { _id: ObjectId('5a2191ebacbbfc2bdc4dcffc'), name: "Amanda", status: "Updated" }
    

    Observação importante: você não pode especificar um validador para coleções nos bancos **admin**de dados local, e config.

    Você não pode especificar um validatorpara system.*coleções.

    Para sua referência adicional com a validação do jsonSchema aqui , aqui e aqui

    • -2

relate perguntas

  • Mongo Map-Reduce ou Sharding?

  • Configurando o Mongo com clustering

  • Diferença entre as chamadas find e findone do MongoDB

  • A fragmentação é eficaz para coleções pequenas?

  • Bons recursos para operar/administrar o MongoDB

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve