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 / 203822
Accepted
Joey Yi Zhao
Joey Yi Zhao
Asked: 2018-04-13 17:44:30 +0800 CST2018-04-13 17:44:30 +0800 CST 2018-04-13 17:44:30 +0800 CST

Por que o mongodb falha na validação do esquema json?

  • 772

Estou usando o mongodb 3.6 e tenho o validador abaixo para a studentscoleção:

rs1:PRIMARY> db.getCollectionInfos({name: 'students'})
[
    {
        "name" : "students",
        "type" : "collection",
        "options" : {
            "validator" : {
                "$jsonSchema" : {
                    "properties" : {
                        "name" : {
                            "bsonType" : "string",
                            "description" : "name"
                        },
                        "age" : {
                            "bsonType" : "int",
                            "minimum" : 10,
                            "maximum" : 30
                        }
                    },
                    "required" : [
                        "name",
                        "age"
                    ],
                    "bsonType" : "object"
                }
            },
            "validationLevel" : "strict",
            "validationAction" : "error"
        },
        "info" : {
            "readOnly" : false,
            "uuid" : BinData(4,"111r7z+rQpGoebZ1jAHO4g==")
        },
        "idIndex" : {
            "v" : 2,
            "key" : {
                "_id" : 1
            },
            "name" : "_id_",
            "ns" : "test.students"
        }
    }
]

requer duas propriedades namee age. O nome deve ser uma string e a idade deve estar entre 10 e 30. Mas por que a inserção abaixo falha?

rs1:PRIMARY> db.students.insert({age: 11, name: 'Mike'})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})
mongodb mongodb-3.6
  • 1 1 respostas
  • 7448 Views

1 respostas

  • Voted
  1. Best Answer
    Md Haidar Ali Khan
    2018-04-14T05:51:12+08:002018-04-14T05:51:12+08:00

    Como eu posso ver que você está recebendo a writeErrorinserção Error code : 121assim

    "nInserted" : 0,
        "writeError" : {
            "code" : 121,
            "errmsg" : "Document failed validation"
    

    De acordo com a documentação do blog do MongoDB @Jai Hirsch aqui para validação de documentos do MongoDB. Às vezes você quer documentos de forma totalmente livre e às vezes não. Na 3.2 release of MongoDBideia de document validationfoi introduzida. Uma área que encontrei problemas no passado é com datas sendo inseridas usando diferentes tipos de dados.

    Exemplo: (notação de linha de comando usada para abreviar) A primeira equipe estava usando datas numéricas:

     db.date.insert({date:20150321}) 
    

    A segunda equipe estava usando o formato de string:

    db.date.insert({date:"03/21/2015"})
    

    A terceira equipe estava usando datas ISO:

     db.date.insert({date:new Date('Mar 21, 2015')}) 
    

    Os problemas de comunicação que levam a esse problema são uma história para outro momento, mas é desnecessário dizer que uma boa quantidade de limpeza de dados foi necessária para corrigir o problema, pois o aplicativo principal que lia os dados esperava uma data ISO. O problema do código foi resolvido usando uma biblioteca compartilhada que definia o objeto de mapeamento do banco de dados. Agora vamos dar uma olhada em como a validação de documentos pode ser usada para resolver esse problema.

    Vamos criar uma coleção com o seguinte comando:

    db.createCollection( "date", {
        validator: { date: {$type:"date"}}
    } )
    

    Com a coleção criada com o validador agora só se pode inserir usando o novo formato Date():

    db.date.insert({date:new Date('Mar 21, 2015')})
    

    As inserções numéricas e de string darão o seguinte erro:

    WriteResult({
        "nInserted" : 0,
        "writeError" : {
            "code" : 121,
            "errmsg" : "Document failed validation"
        }
    })
    

    da mesma forma, quase todo desenvolvedor novo MongoDBcometerá esse "erro" na linha de comando, como:

    db.numbers.insert({number:2})
    

    Alguém poderia pensar que eles inseriram um documento contendo o número inteiro twona coleção, quando na verdade o documento agora contém um valor de ponto flutuante.

    Posso atestar a dor que isso pode causar (especialmente se você estiver usando uma linguagem fortemente tipada, como JAVA).

    Podemos usar o validador para nos proteger contra isso:

    db.createCollection( "numbers", {
        validator: { number: {$type:"int" }}
    } )
    

    A inserção anterior agora nos dará o 121 error codee você precisa usar o NumberInt constructor:

    db.numbers.insert({number:NumberInt(2)})
    
    • 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