Como descobrir o tipo de uma variável no mongosh
- Postado por Adriano Bonacin
- Categorias mongodb
- Data 02/02/2022
- Comentários 0 comentário
Nosso dia a dia trabalhando com dados em diferentes tecnologias costuma não ser muito fácil. Tecnologias distintas costumam usar os tipos de dados ligeiramente diferente. O que é um VARCHAR2 no Oracle é encarado como String no MongoDB. E, eventualmente, no MongoDB você acaba trabalhando com estruturas mais complexas e saber qual o tipo, se é iterável ou não, faz diferença. Então, aqui falaremos como descobrir o tipo de uma variável no mongosh.
Os datatypes que podemos usar no MongoDB estão definidos aqui. Neste curto artigo vou focar no mongosh e na programação que usamos no dia a dia. Em breve vou escrever alguns artigos sobre scripts usados por DBAs no MongoDB e a idéia é que fique mais claro lendo este aqui.
Tipos
Sabemos que podemos iterar em um cursor, em um array. Mas como saber se o datatype que estamos trabalhando é um destes?
Primeiro vamos olhar para o retorno do nosso rs.status() (vou remover algumas partes para melhorar a legibilidade) e escolher alguns elementos para testar.
rsYadax0 [direct: primary] yadax> rs.status()
{
set: 'rsYadax0',
date: ISODate("2022-02-01T13:54:36.606Z"),
myState: 1,
...
optimes: {
lastCommittedOpTime: { ts: Timestamp({ t: 1643723667, i: 1 }), t: Long("13") },
...
},
lastStableRecoveryTimestamp: Timestamp({ t: 1643723637, i: 1 }),
electionCandidateMetrics: {
lastElectionReason: 'electionTimeout',
...
},
electionParticipantMetrics: {
votedForCandidate: false,
...
},
members: [
{
_id: 0,
name: 'mymongo1:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
...
},
{
_id: 1,
name: 'mymongo2:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
},
{
_id: 2,
name: 'mymongo3:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
}
],
ok: 1,
'$clusterTime': {
...
}
},
operationTime: Timestamp({ t: 1643723667, i: 1 })
}
rsYadax0 [direct: primary] yadax>
Vamos olhar para o retorno em si, para o campo ‘ok’, para o ‘members’, para o ‘optimes’ e para o ‘operationTime’. Você sabe dizer quais são seus tipos?
Quando temos um documento, como o retorno do rs.status() que começa com { e termina com }, o retorno será Object. Quando começa com [ e termina com ], o tipo é array e neste podemos iterar. Os outros são triviais: Number, Timestamp e assim por diante.
Como descobrir os tipos
Chega de conversa fiada e vamos logo descobrir os tipos. A mágica acontece com o objeto ‘constructor’. Basta adicionar no final da nossa variável ou de qualquer método que nos retorne alguma informação o trecho: “.constructor.name”
Primeiro, o retorno do rs.status(), que começa e termina com {}:
rsYadax0 [direct: primary] yadax> rs.status().constructor.name
Object
rsYadax0 [direct: primary] yadax>
Agora vamos olhar para os membros:
rsYadax0 [direct: primary] yadax> rs.status().members.constructor.name
Array
rsYadax0 [direct: primary] yadax>
Agora para o ‘ok’ e para o ‘operationTime’:
rsYadax0 [direct: primary] yadax> rs.status().ok.constructor.name
Number
rsYadax0 [direct: primary] yadax> rs.status().operationTime.constructor.name
Timestamp
rsYadax0 [direct: primary] yadax>
O ‘optimes’ é um documento encadeado (embedded document), e seu tipo também será Object:
rsYadax0 [direct: primary] yadax> rs.status().optimes.constructor.name
Object
rsYadax0 [direct: primary] yadax>
Por fim, o retorno de um find() será um cursor:
rsYadax0 [direct: primary] yadax> db.cars.find().constructor.name
Cursor
rsYadax0 [direct: primary] yadax>
E para concluir, tudo que fizemos pode estar atribuído a uma variável e a forma como vamos descobrir é a mesma.
myCars = db.cars.find()
[
{
_id: ObjectId("61f7d30fe224569f44492635"),
marca: 'VW',
...
}
]
rsYadax0 [direct: primary] yadax> myCars.constructor.name
Cursor
rsYadax0 [direct: primary] yadax>
Assim, sabendo o tipo do objeto fica mais simples de entender o que podemos usar para manipulá-lo. Espero que seja útil.