Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Tipos de dados no shell legado mongo shell

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.

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 objeto Date usando o wrapper ISODate() .

  • ISODate() construtor que retorna um objeto Date usando o wrapper ISODate() .

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.

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.

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.

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

Dica

Consulte:

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:

  1. Use $inc para incrementar o campo calc em 5, que o shell mongo trata como um flutuador:

    db.collection.updateOne( { _id: 10 },
    { $inc: { calc: 5 } } )
  2. 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.

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.

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.

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.

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" } } )

Para determinar o tipo de campos, o shell mongo fornece os operadores instanceof e typeof .

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 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 .

Voltar

Escrever scripts para o shell mongo

Nesta página