Aviso
O documento a seguir pertence ao mongo
shell, incluído no download do MongoDB Server. Para obter informações sobre a nova shell MongoDB (),mongosh
consulte a documentação mongosh.
Para entender as diferenças entre as duas conchas, consulte Comparação da shell mongo
e mongosh
.
O MongoDB BSON oferece suporte para tipos de dados adicionais além do JSON. Os drivers fornecem suporte nativo para esses tipos de dados em linguagens host e o shell mongo
também fornece várias classes auxiliares para dar suporte ao uso desses tipos de dados no shell JavaScript mongo
. Consulte a referência de JSON estendido para obter mais informações.
Tipos
Data
O shell mongo
oferece vários métodos para retornar a data, seja como uma string ou como um objeto Date
:
Date()
de retorno que retorna a data atual como uma string.new Date()
construtor que retorna um objetoDate
usando o wrapperISODate()
.ISODate()
construtor que retorna um objetoDate
usando o wrapperISODate()
.
Internamente, os objetos de Data são armazenados como um número inteiro assinado de 64-bit representando o número de milésimos de segundo desde a época do Unix (1 de janeiro de 1970).
Nem todas as operações e drivers de banco de dados oferecem suporte à faixa completa de 64 bits. Você pode trabalhar com segurança com datas com anos dentro da faixa inclusiva de 0
a 9999
.
Data de retorno como uma cadeia de caracteres
Para retornar a data como uma string, utilize o método Date()
, como no seguinte exemplo:
var myDateString = Date();
Para imprimir o valor da variável, digite o nome da variável no shell, conforme a seguir:
myDateString
O resultado é o valor de myDateString
:
Wed Dec 19 2012 01:03:25 GMT-0500 (EST)
Para verificar o tipo, utilize o operador typeof
, como no seguinte:
typeof myDateString
A operação retorna string
.
Return Date
O shell mongo
envolve objetos do tipo Date
com o auxiliar ISODate
; no entanto, os objetos permanecem do tipo Date
.
O exemplo seguinte utiliza o construtor new Date()
e o construtor ISODate()
para retornar objetos Date
.
var myDate = new Date(); var myDateInitUsingISODateWrapper = ISODate();
Você também pode utilizar o operador new
com o construtor ISODate()
.
Para imprimir o valor da variável, digite o nome da variável no shell, conforme a seguir:
myDate
O resultado é o valor Date
de myDate
envolto no auxiliar ISODate()
:
ISODate("2012-12-19T06:01:17.171Z")
Para verificar o tipo, utilize o operador instanceof
, como no seguinte:
myDate instanceof Date myDateInitUsingISODateWrapper instanceof Date
A operação retorna true
para ambos.
ObjectId
O shell mongo
fornece a classe de wrapper ObjectId()
em torno do tipo de dados ObjectId . Para gerar um novo ObjectId, use a seguinte operação no shell mongo
:
new ObjectId
Número longo
A shell mongo
trata todos os números como valores de ponto flutuante por padrão. O mongo
shell fornece o NumberLong()
wrapper para lidar com 64inteiros de bits.
O invólucro NumberLong()
aceita o comprimento como uma string:
NumberLong("2090845886852")
Os exemplos a seguir usam o wrapper NumberLong()
para escrever na coleção:
db.collection.insertOne( { _id: 10, calc: NumberLong("2090845886852") } ) db.collection.updateOne( { _id: 10 }, { $set: { calc: NumberLong("2555555000000") } } ) db.collection.updateOne( { _id: 10 }, { $inc: { calc: NumberLong("5") } } )
Recupere o documento para verificar:
db.collection.findOne( { _id: 10 } )
No documento retornado, o campo calc
contém um objeto NumberLong
:
{ "_id" : 10, "calc" : NumberLong("2555555000005") }
Se você usar $inc
para incrementar o valor de um campo que contém um objeto NumberLong
por um float, o tipo de dados será alterado para um valor de ponto flutuante, como no exemplo a seguir:
Use
$inc
para incrementar o campocalc
em5
, que o shellmongo
trata como um flutuador:db.collection.updateOne( { _id: 10 }, { $inc: { calc: 5 } } ) Recupere o documento atualizado:
db.collection.findOne( { _id: 10 } ) No documento atualizado, o campo
calc
contém um valor de ponto flutuante:{ "_id" : 10, "calc" : 2555555000010 }
Observação
Embora o NumberLong()
construtor aceite integer
valores do shell (ou mongo
seja, sem aspas), isso não é recomendado. Especificar um valor inteiro maior do que o Number.MAX_SAFE_INTEGER
definido pelo JavaScript (que é o número 2^53 - 1
) pode levar a um comportamento inesperado.
NumberInt
A shell mongo
trata todos os números como valores de ponto flutuante por padrão. O shell mongo
fornece ao construtor NumberInt()
especifique explicitamente 32inteiros de bits.
NumberDecimal
Novidade na versão 3.4.
A shell mongo
trata todos os números como valores de ponto flutuante 64-bit double
por padrão. O shell mongo
fornece ao construtor NumberDecimal()
para especificar explicitamente 128valores de ponto flutuante baseados em decimais de bits capazes de emular arredondamento decimal com precisão exata. Esta funcionalidade destina-se a aplicações que lidam com dados monetários, como computação financeira, fiscal e científica.
O tipo decimal
BSON utiliza o formato de numeração de ponto flutuante IEEE 754 decimal128 que suporta 34 dígitos decimais (ou seja, dígitos significativos) e um intervalo de expoentes de −6143 a +6144.
O construtor NumberDecimal()
aceita o valor decimal
como uma string:
NumberDecimal("1000.55")
O valor é armazenado no banco de dados da seguinte maneira:
NumberDecimal("1000.55")
O NumberDecimal()
construtor também aceita double
valores do shell (ou mongo
seja, sem aspas), embora isso não seja recomendado devido ao risco de perda da precisão. O construtor cria uma representação de precisão double
baseada em binário do parâmetro baseado em decimal (podendo perder precisão) e, em seguida, converte esse valor em um valor decimal
com uma precisão de 15 dígitos. O exemplo a seguir passa o valor implicitamente como double
e mostra como ele é criado com uma precisão de 15 dígitos:
NumberDecimal(1000.55)
O valor é armazenado no banco de dados da seguinte maneira:
NumberDecimal("1000.55000000000")
O exemplo a seguir passa o valor implicitamente como double
e mostra como pode ocorrer uma perda de precisão:
NumberDecimal(9999999.4999999999)
O valor é armazenado no banco de dados da seguinte maneira:
NumberDecimal("9999999.50000000")
Observação
Para usar o tipo de dados decimal
com um driver MongoDB, certifique-se de usar uma versão de driver que ofereça suporte a ele.
Igualdade e ordem de classificação
Os valores do tipo decimal
são comparados e classificados com outros tipos numéricos com base em seu valor numérico real. Os valores numéricos do tipo double
com base binária geralmente têm representações aproximadas dos valores com base decimal e podem não ser exatamente iguais às suas representações decimal
, portanto, use o construtor NumberDecimal()
ao verificar a igualdade dos valores decimal
. Considere os seguintes exemplos com os seguintes documentos na coleção numbers
:
{ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" } { "_id" : 2, "val" : 9.99, "description" : "Double" } { "_id" : 3, "val" : 10, "description" : "Double" } { "_id" : 4, "val" : NumberLong("10"), "description" : "Long" } { "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" }
Quando as queries da tabela abaixo são conectadas ao método db.numbers.find(<query>)
, os seguintes resultados são retornados:
Query | Resultados |
---|---|
{ "val": 9.99 } | { "_id": 2, "val": 9.99, "description": "double" } |
{ "val": NumberDecimal( "9.99" ) } | { "_id": 1, "val": NumberDecimal( "9.99" ), "description": "Decimal" } |
{ valor: 10 } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
{ valor: NumberDecimal( "10" ) } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
A primeira query, { "val": 9.99 }
, pesquisa implicitamente a representação double
de 9.99
que não é igual à representação decimal
do valor.
O construtor NumberDecimal()
é usado para fazer query do documento com a representação decimal
de 9.99
. Os valores do tipo double
são excluídos porque não correspondem ao valor exato da representação decimal
de 9.99
.
Valores correspondentes de todos os tipos numéricos são retornados ao executar queries de números inteiros. Por exemplo, a query de uma representação double
de 10
incluirá uma representação decimal
de 10.0
nos resultados e vice-versa.
Verificando o decimal
tipo
Para testar o tipo decimal
, use o operador $type
com o alias de string "decimal"
ou 19
, o código numérico do tipo decimal
.
db.inventory.find( { price: { $type: "decimal" } } )
Verificar tipos no mongo
shell
Para determinar o tipo de campos, o shell mongo
fornece os operadores instanceof
e typeof
.
instanceof
instanceof
retorna um booleano para testar se um valor é uma instância de algum tipo.
Por exemplo, a seguinte operação testa se o campo _id
é uma instância do tipo ObjectId
:
mydoc._id instanceof ObjectId
A operação retorna true
.
typeof
typeof
retorna o tipo de um campo.
Por exemplo, a seguinte operação retorna o tipo do campo _id
:
typeof mydoc._id
Nesse caso, typeof
retornará o tipo object
mais genérico em vez do tipo ObjectId
.