Tipos de dados
Nesta página
- Data
- ObjectId
- Double
- Int32
- Long
- Decimal128
- Igualdade e ordem de classificação
- Timestamp
- Verificação de tipo
- Exemplos
- Data de retorno como uma cadeia de caracteres
- Return
Date
- Tipos Numéricos
- Consistência de tipo numérico padrão
- Timestamp de um novo documento
- Criar um timestamp personalizado
- Verificação de tipo com
$type()
- Digite Verificando com um Construtor
O MongoDB armazena dados usando BSON, que é compatível com tipos de dados adicionais que não estão disponíveis no JSON. O shell mongosh
tem uma compatibilidade melhor de tipo de dados para drivers do que o shell mongo
legado.
Este documento destaca as alterações no uso do tipo entre mongosh
e o shell mongo
legado. Consulte a referência de JSON estendido para obter mais informações sobre os tipos compatíveis.
Data
mongosh
fornece 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()
.
ObjectId
mongosh
fornece a ObjectId()
classe wrapper em torno do tipo de dados ObjectId. Para gerar um novo ObjectId, utilize a seguinte operação em mongosh
:
new ObjectId
A partir da versão 1.8.0, o wrapper ObjectId
não aceita mais:
ObjectId.prototype.generate
ObjectId.prototype.getInc
ObjectId.prototype.get_inc
ObjectId.getInc
Double
O construtor Double() pode ser usado para especificar explicitamente um double:
db.types.insertOne( { "_id": 2, "value": Double(1), "expectedType": "Double" } )
Observação
Se o valor do campo for um número que possa ser convertido em um inteiro de 32bits, mongosh
o armazenará como Int32
. Caso contrário, o mongosh
padroniza para armazenar o número como um Double
. Para especificar o tipo de valor, use os construtores Double()
ou Int32()
.
Int32
O construtor Int32() pode ser usado para especificar explicitamente 32números inteiros de bits.
db.types.insertOne( { "_id": 1, "value": Int32(1), "expectedType": "Int32" } )
Aviso
Os tipos padrão Int32
e Double
podem ser armazenados de forma inconsistente se você se conectar à mesma coleção usando tanto o shell mongosh
quanto o mongo
legado.
Long
O construtor Long() pode ser utilizado para especificar explicitamente um número inteiro de 64 bits.
db.types.insertOne( { "_id": 3, "value": Long(1), "expectedType": "Long" } )
Decimal128
Valores decimais128() são números de ponto flutuante baseados em decimal de 128 bits que emulam o arredondamento decimal com precisão exata.
Essa funcionalidade destina-se a aplicativos que lidam com dados monetários, como computação financeira, fiscal e científica.
O Decimal128
tipo BSON usa o formato de numeração de ponto flutuante decimal IEEE 754 128 que suporta 34 dígitos decimais (isto é, dígitos significativos) e um intervalo de expoentes de −6143 a +6144.
db.types.insertOne( { "_id": 5, "value": Decimal128("1"), "expectedType": "Decimal128" } )
Observação
Para usar o tipo de dados Decimal128
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 Decimal128
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 decimais.
Timestamp
O MongoDB utiliza um carimbo de data/hora BSON internamente no oplog. O tipo Timestamp
funciona de maneira similar ao carimbo de data/hora em Java. Use o tipo Date para operações que envolvam datas.
Uma assinatura do Timestamp
tem dois parâmetros opcionais.
Timestamp( { "t": <integer>, "i": <integer> } )
Parâmetro | Tipo | Default | Definição |
---|---|---|---|
| inteiro | Hora atual desde a Era UNIX. | Opcional. Um tempo em segundos. |
| inteiro | 1 | Opcional. Usado para ordenação quando há múltiplas operações em um determinado segundo. |
Para obter exemplos de uso, consulte Timestamp de um novo documento, Criar um timestamp personalizado.
Verificação de tipo
Utilize o operador de query $type
ou examine o construtor de objetos para determinar os tipos.
O operador Javascript typeof
retorna valores genéricos, como number
ou object
, em vez de Int32
ou ObjectId
mais específicos.
O operador instanceof
do Javascript não é confiável. Por exemplo, o instanceof
atribui valores de BSON em uma resposta do servidor a uma classe de base diferente dos valores fornecidos pelo usuário.
Para obter exemplos de uso, consulte as seções Verificação de tipo com $type()
e Verificação de tipo com um construtor.
Exemplos
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
mongosh
agrupa objetos do tipo Date
com o auxiliar ISODate
; entretanto, 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:
var myDate = ISODate("2021-03-21T06:00:00.171Z") Object.prototype.toString.call(myDate) === "[object Date]"
A operação retorna true
.
Tipos Numéricos
Considere a collection types
:
{ _id: 1, value: 1, expectedType: 'Int32' }, { _id: 2, value: Long("1"), expectedType: 'Long' }, { _id: 3, value: 1.01, expectedType: 'Double' }, { _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128' }, { _id: 5, value: 3200000001, expectedType: 'Double' }
Esta tabela mostra os resultados do comando db.types.find( <QUERY> )
para o <QUERY>
correspondente. Os nomes de tipo e aliases são fornecidos na página de tipos de BSON .
Query | Resultados | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
|
A query { "value": 1.01 }
pesquisa implicitamente a representação Double
do 1.01
. O documento _id: 4
é Decimal128
, portanto não está selecionado.
Observe, no entanto, que { "value": 1 }
retorna os tipos Int32
e Long
.
Consistência de tipo numérico padrão
Considere a coleção typeExample
. Esta coleção consiste em dois documentos idênticos, { "a": 1 }
. O primeiro documento foi criado na shell legada de mongo
, o segundo documento foi criado em mongosh
.
Podemos usar o operador $type
em um pipeline de agregação para ver o tipo atribuído em cada shell.
db.typeExample.aggregate( [ { $project: { "valueType": { "$type": "$a" }, "_id": 0 } } ] )
No primeiro documento, criado na shell mongo
legada, o valor foi armazenado como double
. No documento mongosh
o valor foi armazenado como tipo int
.
[ { valueType: 'double' // inserted in legacy mongo shell }, { valueType: 'int' // inserted in mongosh } ]
Timestamp de um novo documento
Use Timestamp()
sem parâmetros para inserir vários documentos usando as configurações padrão:
db.flights.insertMany( [ { arrival: "true", ts: Timestamp() }, { arrival: "true", ts: Timestamp() }, { arrival: "true", ts: Timestamp() } ] )
Execute db.flights.find({})
para ver os timestamps. Observe que, embora todas as três entradas tenham sido marcadas no mesmo segundo, o intervalo foi incrementado em cada uma delas.
[ { _id: ObjectId("6114216907d84f5370391919"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 1 }) }, { _id: ObjectId("6114216907d84f537039191a"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 2 }) }, { _id: ObjectId("6114216907d84f537039191b"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 3 }) } ]
Criar um timestamp personalizado
Use parâmetros personalizados para inserir vários documentos com um Timestamp
específico.
Esta operação insere três documento na coleção flights
e usa o valor de Era UNIX 1627811580
para definir os horários de ts
para 9:53 GMT em 1 agosto de 2021.
db.flights.insertMany( [ { arrival: "true", ts: Timestamp(1627811580, 10) }, { arrival: "true", ts: Timestamp(1627811580, 20) }, { arrival: "true", ts: Timestamp(1627811580, 30) } ] )
Os documentos resultantes têm a seguinte aparência:
[ { _id: ObjectId("6123d8315e6bba6f61a1031c"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 10 }) }, { _id: ObjectId("6123d8315e6bba6f61a1031d"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 20 }) }, { _id: ObjectId("6123d8315e6bba6f61a1031e"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 30 }) } ]
Verificação de tipo com $type()
O operador de query $type
aceita um alias de string ou um código numérico correspondente ao tipo de dados. Consulte Tipos BSON para obter uma lista de tipos de dados BSON e seus códigos numéricos correspondentes.
Por exemplo, estas verificações para o tipo Decimal128
são equivalentes:
db.types.find( { "value": { $type: "decimal" } } ) db.types.find( { "value": { $type: 19 } } )
Digite Verificando com um Construtor
Examine o objeto constructor
para determinar o tipo. Por exemplo, a saída de db.collection.find()
é um Cursor
.
var findResults = db.housing.find({"multiUnit": true} ) findResults.constructor.name // Returns the type