1 Como utilizar o MongoDB através do R

O presente relatório visa organizar em um mesmo documento todas as etapas de estudo acerca da integração do MongoDB junto ao R através da biblioteca Mongolite, e outros pacotes, que visam auxiliar na manipulação de bancos de dados.

Esse relatório está sendo elaborado para o projeto de pesquisa IC coordenado pela professora Taiane Prass.

1.1 Diferenças entre os tipos de dados

Aqui vamos pinçar alguns comentários acerda das diferenças entre as formas mais usuais de amarzenamento de dados: dados estruturados, dados não estruturados e dados semi-estruturados.

Como o próprio nome sugere, dados estruturados são formatados de forma que seguem uma ordem, normalmente através de tabelas que contém linhas e colunas, o que gera uma maior facilidade de processamento, análise e interpretação dos dados. Por outro lado, dados não estruturados não seguem uma lógica padrão de armazenamento, o que torna o seu processamento um pouco mais trabalhoso.

Ambos tem suas vantagens e limitações e a escolha da forma de armazenamento vai depender da necessidade/habilidade do usuário.

Por fim existe o modelo semi-estruturado de armazenamento de dados, ou armazenamento de documentos, que são programas de computador e sistema de armazenamento de dados que são planejados para armazenamento, recuperação e manuseio de informação orientada a documentos1. Este é o tipo de banco de dados utilizados no MongoDB.

1.2 O que é o MongoDB?

“MongoDB é um software de banco de dados orientado a documentos livre, de código aberto e multiplataforma, escrito na linguagem C++. Classificado como um programa de banco de dados NoSQL, o MongoDB usa documentos semelhantes a JSON com esquemas.”2

1.3 Como integrar o MongoDB ao R?

O primeiro passo é efetuar o download do Mongodb no seu computador. Para tal, basta acessar o link Download MongoDB.

No presente relatório será utilizado a versão “Community Server” do software.

Após efetuar o download do mesmo, caso esta seja a primeira vez que está utilizando o software, basta prosseguir com as opções sugeridas pelo distribuidor para efetuar a instalação padrão do mesmo.

1.3.1 O Mongolite

Concluída a instalação do MongoDB, é hora de fazer a integração do MongoDB com o R.

Após abrir o R através do RStudio, o primeiro passo é fazer o download da biblioteca “Mongolite” que será utilizada para fazer a integração. Você pode procurar pelo pacote dentro do próprio RStudio clicando no ícone “Tools” e depois em “Install Packages…”.

Uma vez aberta a janela de pesquisa de pacotes, basta procurar pelo pacote “Mongolite” e efetuar o download.

1.3.2 Procurando pelos arquivos JSON no computador

# lista de arquivos no diretório
fileNames = list.files("D:/Dropbox/000Projetos/Datasets/LattesTestes", recursive = TRUE, full.names = TRUE)
length(fileNames)
## [1] 989
js = grep("json", fileNames, value = TRUE)
length(js)
## [1] 988
# procurando os que tem json
i = grep("json", fileNames)

# esses são os que não tem json no nome
fileNames[- i]
## [1] "D:/Dropbox/000Projetos/Datasets/LattesTestes/ArquivoDummy.txt"
# esses são os que tem json no nome
ler = fileNames[i]
head(ler)
## [1] "D:/Dropbox/000Projetos/Datasets/LattesTestes/K4103457E2.json"
## [2] "D:/Dropbox/000Projetos/Datasets/LattesTestes/K4103630U1.json"
## [3] "D:/Dropbox/000Projetos/Datasets/LattesTestes/K4104421P9.json"
## [4] "D:/Dropbox/000Projetos/Datasets/LattesTestes/K4104471Z4.json"
## [5] "D:/Dropbox/000Projetos/Datasets/LattesTestes/K4106005A1.json"
## [6] "D:/Dropbox/000Projetos/Datasets/LattesTestes/K4113338A7.json"

1.3.3 Conectando o R com o MongoDB

Concluída a instalação do pacote, deve-se “chamá-lo” na sintaxe escrevendo “library(mongolite)”.

library(mongolite)
## Warning: package 'mongolite' was built under R version 4.1.2

A seguir, faremos uso da primeira função do mongolite, que é a interação do Mongo através do R.

A função “‘nome’ = mongo(collection = nome_coleção, db = nome_banco)” estabelece a conexão com o Mongo e caso não exista a coleção ou banco de dados nomeada, o programa a cria na hora.

lattes <- mongo(db ="TestesMongoR", collection = "LattesTestes")

Agora vamos preencher o banco de dados. Para isso, vamos utilizar a função $import:

# importando os dados
for(i in 1:length(ler)) lattes$import(file(ler[i]))

1.4 Funções do Mongolite

Estabelecida a conexão entre os programas, agora faremos alguns exemplos de funções que o pacote mongolite oferece.

1.4.1 Função count

Esta função calcula a quantidade de linhas que existem no banco de dados que está em execução:

lattes$count()
## [1] 987

1.4.2 Função iterate

Esta função mostra todos os dados associados a uma entrada:

lattes$iterate()$one()
## $Kid
## $Kid[[1]]
## [1] "K4103457E2"
## 
## 
## $Lid
## $Lid[[1]]
## [1] "2132783387012249"
## 
## 
## $doctorate
## $doctorate[[1]]
## [1] "UNIVERSIDADE FEDERAL DE OURO PRETO, UFOP, BRASIL"
## 
## 
## $OutBR
## $OutBR[[1]]
## [1] FALSE
## 
## 
## $Sanduiche
## $Sanduiche[[1]]
## [1] FALSE
## 
## 
## $Bolsa
## $Bolsa[[1]]
## [1] FALSE
## 
## 
## $AnoTermino
## $AnoTermino[[1]]
## [1] "2014"
## 
## 
## $TempoDeDr
## $TempoDeDr[[1]]
## [1] 6
## 
## 
## $subjectarea
## $subjectarea[[1]]
## [1] "other"
## 
## 
## $sex
## $sex[[1]]
## [1] "M"
## 
## 
## $employment
## $employment[[1]]
## [1] "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL."
## 
## 
## $employmentH
## $employmentH[[1]]
## [1] 40
## 
## 
## $Production
## $Production[[1]]
## [1] ""
## 
## 
## $ISSNcodes
## $ISSNcodes[[1]]
## [1] ""
## 
## 
## $NofAuthors
## $NofAuthors[[1]]
## [1] ""
## 
## 
## $Score
## $Score[[1]]
## [1] 0
## 
## 
## $Weights
## $Weights[[1]]
## [1] 1
## 
## 
## $PubYear
## $PubYear[[1]]
## [1] ""
## 
## 
## $Maternity
## $Maternity[[1]]
## [1] 0
## 
## 
## $scimago
## $scimago[[1]]
## [1] ""
## 
## 
## $UF
## $UF[[1]]
## [1] "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL."
## 
## 
## $Sigla
## $Sigla[[1]]
## [1] "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL."

1.4.3 Função find

Esta função busca todos as chaves existentes no banco de dados. Aplicando a função “colnames” podemos ver o nome de todas as chaves existentes no banco utilizado.

aa = lattes$find('{}')
colnames(aa)
##  [1] "Kid"         "Lid"         "doctorate"   "OutBR"       "Sanduiche"  
##  [6] "Bolsa"       "AnoTermino"  "TempoDeDr"   "subjectarea" "sex"        
## [11] "employment"  "employmentH" "Production"  "ISSNcodes"   "NofAuthors" 
## [16] "Score"       "Weights"     "PubYear"     "Maternity"   "scimago"    
## [21] "UF"          "Sigla"

Para ter um resumo das informações constantes em “aa”, podemos usar a função “glimpse” do pacote “dplyr”.

dplyr::glimpse(aa)
## Rows: 987
## Columns: 22
## $ Kid         <list> "K4103457E2", "K4103630U1", "K4104421P9", "K4104471Z4", "~
## $ Lid         <list> "2132783387012249", "7962180105561573", "4420031367303105~
## $ doctorate   <list> "UNIVERSIDADE FEDERAL DE OURO PRETO, UFOP, BRASIL", "UNIV~
## $ OutBR       <list> FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FA~
## $ Sanduiche   <list> FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TR~
## $ Bolsa       <list> FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE,~
## $ AnoTermino  <list> "2014", "2019", "2014", "2007", "2014", "2019", "2015", "~
## $ TempoDeDr   <list> 6, 4, 3, 4, 2, 4, 4, 4, 5, 4, 4, 4, 5, 6, 3, 5, 3, 6, 5, ~
## $ subjectarea <list> "other", "other", "other", "CIÊNCIAS SOCIAIS APLICADAS", ~
## $ sex         <list> "M", "M", "M", "F", "F", "F", "F", "F", "M", "F", "F", "M~
## $ employment  <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "UNIVERS~
## $ employmentH <list> 40, 40, 40, 0, <40, 40>, 40, 0, <80, 0, 0>, "", <40, 0, 0~
## $ Production  <list> "", <"INTERNATIONAL JOURNAL OF OCCUPATIONAL AND ENVIRONME~
## $ ISSNcodes   <list> "", <"21840954", "19805756", "23269006", "19809735", "180~
## $ NofAuthors  <list> "", <4, 4, 6, 5, 3, 4>, <1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ Score       <list> 0, <0.2500, 0.2500, 0.1667, 0.2000, 0.3333, 0.2500>, <1, ~
## $ Weights     <list> 1, 1, 1, 1, <0.5, 0.5>, 1, 1, <1, 0, 0>, 1, <1, 0, 0>, 1,~
## $ PubYear     <list> "", <2018, 2016, 2015, 2011, 2011, 2010>, <2020, 2020, 20~
## $ Maternity   <list> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ scimago     <list> "", <"21840954", "19805756", "23269006", "19809735", "180~
## $ UF          <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "RN", "S~
## $ Sigla       <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "UFERSA"~

Você pode combinar a função $find para performar querrys, como no exemplo abaixo:

a0 = lattes$find(query = '{"sex":"M"}')

Seguem outros exemplos de manipulação do banco usando a função $find:

# puxa todas as colunas
a0 = lattes$find(query = '{"sex":"M"}')

# cria um data frame apenas com id e o sexo
a1 = lattes$find('{"sex":"M"}', fields = '{"sex":1}')

aaa1 = lattes$find(fields = '{"sex":1}')
table(unlist(aaa1$sex))/nrow(aaa1)
## 
##          F          M      other 
## 0.51671733 0.46099291 0.02228977
# cria uma lista de "listas". As entradas são id, sex e PubYear
a2 = lattes$find('{"sex":"M"}', fields = '{"sex":1, "PubYear":1}')

# separa os masculinos. Tem 17 variaveis porque ele cria uma
# variavel que é a id.
masculino <- lattes$find('{"sex": "M"}', fields = '{}')
dplyr::glimpse(a0)
## Rows: 455
## Columns: 22
## $ Kid         <list> "K4103457E2", "K4103630U1", "K4104421P9", "K4125113T8", "~
## $ Lid         <list> "2132783387012249", "7962180105561573", "4420031367303105~
## $ doctorate   <list> "UNIVERSIDADE FEDERAL DE OURO PRETO, UFOP, BRASIL", "UNIV~
## $ OutBR       <list> FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FA~
## $ Sanduiche   <list> FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TR~
## $ Bolsa       <list> FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE~
## $ AnoTermino  <list> "2014", "2019", "2014", "2019", "2009", "2006", "2018", "~
## $ TempoDeDr   <list> 6, 4, 3, 5, 4, 6, 3, 5, 3, 6, 5, 4, 3, 4, 4, 4, 4, 3, 3, ~
## $ subjectarea <list> "other", "other", "other", "CIÊNCIAS BIOLÓGICAS", "CIÊNCI~
## $ sex         <list> "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M~
## $ employment  <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "UNIVERS~
## $ employmentH <list> 40, 40, 40, "", 40, 4, <0, 20>, "", 0, <0, 40>, 40, 40, 4~
## $ Production  <list> "", <"INTERNATIONAL JOURNAL OF OCCUPATIONAL AND ENVIRONME~
## $ ISSNcodes   <list> "", <"21840954", "19805756", "23269006", "19809735", "180~
## $ NofAuthors  <list> "", <4, 4, 6, 5, 3, 4>, <1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ Score       <list> 0, <0.2500, 0.2500, 0.1667, 0.2000, 0.3333, 0.2500>, <1, ~
## $ Weights     <list> 1, 1, 1, 1, 1, 1, <0, 1>, 1, 1, <0, 1>, 1, 1, 1, <1, 0>, ~
## $ PubYear     <list> "", <2018, 2016, 2015, 2011, 2011, 2010>, <2020, 2020, 20~
## $ Maternity   <list> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ scimago     <list> "", <"21840954", "19805756", "23269006", "19809735", "180~
## $ UF          <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "RN", "S~
## $ Sigla       <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "UFERSA"~
dplyr::glimpse(masculino)  # mesmo que a0, mas inclui id.
## Rows: 455
## Columns: 23
## $ `_id`       <chr> "62041ba9280f0000ad000592", "62041ba9280f0000ad000593", "6~
## $ Kid         <list> "K4103457E2", "K4103630U1", "K4104421P9", "K4125113T8", "~
## $ Lid         <list> "2132783387012249", "7962180105561573", "4420031367303105~
## $ doctorate   <list> "UNIVERSIDADE FEDERAL DE OURO PRETO, UFOP, BRASIL", "UNIV~
## $ OutBR       <list> FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FA~
## $ Sanduiche   <list> FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TR~
## $ Bolsa       <list> FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE~
## $ AnoTermino  <list> "2014", "2019", "2014", "2019", "2009", "2006", "2018", "~
## $ TempoDeDr   <list> 6, 4, 3, 5, 4, 6, 3, 5, 3, 6, 5, 4, 3, 4, 4, 4, 4, 3, 3, ~
## $ subjectarea <list> "other", "other", "other", "CIÊNCIAS BIOLÓGICAS", "CIÊNCI~
## $ sex         <list> "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M~
## $ employment  <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "UNIVERS~
## $ employmentH <list> 40, 40, 40, "", 40, 4, <0, 20>, "", 0, <0, 40>, 40, 40, 4~
## $ Production  <list> "", <"INTERNATIONAL JOURNAL OF OCCUPATIONAL AND ENVIRONME~
## $ ISSNcodes   <list> "", <"21840954", "19805756", "23269006", "19809735", "180~
## $ NofAuthors  <list> "", <4, 4, 6, 5, 3, 4>, <1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ Score       <list> 0, <0.2500, 0.2500, 0.1667, 0.2000, 0.3333, 0.2500>, <1, ~
## $ Weights     <list> 1, 1, 1, 1, 1, 1, <0, 1>, 1, 1, <0, 1>, 1, 1, 1, <1, 0>, ~
## $ PubYear     <list> "", <2018, 2016, 2015, 2011, 2011, 2010>, <2020, 2020, 20~
## $ Maternity   <list> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
## $ scimago     <list> "", <"21840954", "19805756", "23269006", "19809735", "180~
## $ UF          <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "RN", "S~
## $ Sigla       <list> "INSTITUTO FEDERAL MINAS GERAIS, IFMG, BRASIL.", "UFERSA"~
# usar [] quando quisermos apenas aquele valor
p1 <- lattes$find('{"Production": ["ARQUIVO BRASILEIRO DE MEDICINA VETERINÁRIA E ZOOTECNIA"]}', fields = '{}')

# usar entre aspas sem [] quando quisermos que inclua aquele valor,
# mas não precisa ser único.
p0 <- lattes$find('{"Production": "ARQUIVO BRASILEIRO DE MEDICINA VETERINÁRIA E ZOOTECNIA"}', fields = '{}')

# usar [] quando quisermos apenas aquele valor
pp1 <- lattes$find('{"PubYear": ["2018"]}', fields = '{}')

# usar entre aspas sem [] quando quisermos que inclua aquele valor,
# mas não precisa ser único.
pp0 <- lattes$find('{"PubYear": "2018"}', fields = '{}')

1.4.4 Função aggregate

Esta função agrega variáveis diferentes e através dela é possível realizar algumas operações entre elas, seguem exemplos:

# agregando
# operadores aparecem com $ e entre aspas
# aqui teste se é uma array e decide o que fazer em cada caso
nr_artigos_1 <- lattes$aggregate('[{"$project": {"doctorate":1,"sex":1,
                               "NofAuthors":{"$cond":{"if":{"$isArray":"$NofAuthors"},
                                              "then":{"$avg":"$NofAuthors"},
                                              "else":"NA"}}}}]')
# aqui aplica a função media sem testar
nr_artigos_2 <- lattes$aggregate('[{"$project": {"doctorate":1,"sex":1,
                               "NofAuthors":{"$avg":"$NofAuthors"}}}]')


# puxa todos os documentos com essas três colunas
nr_artigos_3 <- lattes$aggregate('[{"$project": {"doctorate":1,"sex":1,
                               "NofAuthors":1}}]')


exemplo_aggregate <- lattes$aggregate('[
                       {"$project": {"sex":1,
                                 "TempoDeDr":{"$avg":"$TempoDeDr"},
                                 "Bolsa": {"convert" :  {"$toString": {"$first" : "$Bolsa"}}}}},
                        {"$group": {
                         "_id": {"Sexo" : "$sex", "Bolsa" : "$Bolsa"},
                         "contagem": {"$sum":1},
                         "dout" : {"$avg": "$TempoDeDr"} }}]')

exemplo_aggregate
##   _id.Sexo _id.Bolsa contagem     dout
## 1        F      true      337 4.011905
## 2        M      true      272 4.117647
## 3        F     false      173 3.923077
## 4    other      true       17 4.117647
## 5    other     false        5 4.200000
## 6        M     false      183 3.879121
# criar o mesmo data frame que criamos antes usando o find
match_teste <- lattes$aggregate('[{"$match" : {"sex": "M"}}]')

1.4.5 Função mapreduce

É uma função alternativa ao aggregate3 que realiza basicamente o mesmo procedimento. Esta função basicamente pega todos os itens “iguais” de uma chave e realiza alguma operação envolvendo os valores dele pra resumir a informação. No exemplo abaixo, a função conta a quantidade de vezes que cada revista aparece no banco.

# isso deveria contar quantas vezes cada journal aparece
mpred <- lattes$mapreduce(map = 'function(){
                                 var produ = this.Production;
                                 for(i in produ){emit(produ[i],1);}}',
                          reduce = 'function(key, vals){
                           var count = 0;
                           for(i in vals){count  += vals[i];}
                           return count;}')
head(mpred)
##                                               _id value
## 1 REVISTA BRASILEIRA DE ESTUDOS EM MÚSICA E MÍDIA     1
## 2            BRAZILIAN JOURNAL OF POULTRY SCIENCE     1
## 3                      REVISTA ESTUDOS AMAZÔNICOS     2
## 4                              PEDIATRIC RESEARCH     1
## 5                            RESPIRATORY RESEARCH     1
## 6                             SYNTHESIS-STUTTGART     1

1.4.6 Função drop

Esta função apaga todos os dados que constam na collection utilizada.

lattes$drop()

Podemos verificar que o banco está vazio usando novamente a função count:

lattes$count()
## [1] 0

1.4.7 Função insert

Esta função inclui novos dados no banco. O jeito mais fácil de inserir dados no banco é a partir de um dataframe do próprio R.

lattes$insert(aa)
## List of 5
##  $ nInserted  : num 987
##  $ nMatched   : num 0
##  $ nRemoved   : num 0
##  $ nUpserted  : num 0
##  $ writeErrors: list()

Como podemos ver:

lattes$count()
## [1] 987

1.4.8 Função update

Esta função atualiza os dados da entrada selecionada. Caso a chave (variável) não exista, ele cria na hora.

lattes$update('{}', '[{ "$set": { "scimago": {"$cond": {"if": {"$isArray":"$ISSNcodes"},
                                            "then": "$ISSNcodes",
                                            "else": ["NA"]}}} }]', multiple = TRUE)
## List of 3
##  $ modifiedCount: int 0
##  $ matchedCount : int 987
##  $ upsertedCount: int 0

Observe que a variável “scimago” não existia e o mongo a criou. Este procedimento apenas atualizará as entradas selecionadas, caso contrário vai aparecer a indicação “NA”.

aa2 = lattes$find('{}')
colnames(aa2)
##  [1] "Kid"         "Lid"         "doctorate"   "OutBR"       "Sanduiche"  
##  [6] "Bolsa"       "AnoTermino"  "TempoDeDr"   "subjectarea" "sex"        
## [11] "employment"  "employmentH" "Production"  "ISSNcodes"   "NofAuthors" 
## [16] "Score"       "Weights"     "PubYear"     "Maternity"   "scimago"    
## [21] "UF"          "Sigla"

1.4.9 Função remove

Esta função exclui o que for selecionado. Funciona da mesma forma que a função $find quanto à sintaxe. (Ver a função $drop para apagar tudo).

Primeiro vamos conferir a contagem de entradas antes de realizar a operação.

lattes$count()
## [1] 987

Aplicando a função:

lattes$remove('{"Kid":"K4763609D7"}')

Contagem após:

lattes$count()
## [1] 987

1.5 Trabalhando com banco

Após aprendermos algumas funções básicas, vamos trabalhar na limpeza e organização dos dados que serão trabalhados na presente pesquisa.

1.5.1 Organizando o banco Scimago

Primeiro, vamos importar os dados do Scimago que serão utilizados na elaboração dos estudos e adicioná-los ao banco de dados “Scimago” no Mongo. Depois, serão efetuados uma série de comandos para “limpar” os dados da forma que iremos trabalhar e com isso iremos extrair apenas os dados das variáveis de interesse da pesquisa e criar o data frame “bb”. (aqui vão ficar indicados apenas os comandos utilizados para a criação do JSON do banco de dados do Scimago para economia de processamento do texto).

Como podemos ver, o banco Scimago possui a seguinte quantidade de entradas:

scimagodb$count()
## [1] 25897

1.5.2 Limpando e organizando os dados

Agora vamos adicionar os dados extraídos do banco Scimago junto à base de dados lattes onde estão os dados relacionados à produção acadêmica e que serão cruzados.

Entretanto, primeiro precisamos garantir que os bancos estão “alinhados”, ou seja, precisamos garantir que não haja discrepâncias na organização dos dois bancos. Para tal, vamos nos certificar que os dados faltantes estejam bem rotulados dentro dos bancos para que a introdução das novas variáveis ocorra corretamente.

# criando a key scimago baseada nos ISSNs, para
# trocar pelo quartil com base no csv com dados do Scimago
lattes$update('{}', '[{ "$set": { "scimago": {"$cond": {"if": {"$isArray":"$ISSNcodes"},
                                            "then": "$ISSNcodes",
                                            "else": ["No Publication"]}}} }]', multiple = TRUE)

# atualizando os valores da key scimago


ISSNs = unlist(lattes$distinct("ISSNcodes"))
for(is in ISSNs)
  {
  if(is == "") {
    msg <- paste0('{"$set":{"scimago.$[element]": "No ISSN"}}')
    flt <- paste0('[{"element": "', is, '"}]')
  }else{
    quantil = scimagodb$find(paste0('{"ISSN":"', is, '"}'), fields = '{"BestQ":1}')
    if(ncol(quantil) == 0) q = "Q*"
    else q = quantil[,"BestQ"]
    msg <- paste0('{"$set":{"scimago.$[element]": "', q, '"}}')
    flt <- paste0('[{"element": "', is, '"}]')
  }
  lattes$update(query ='{}',
                update = msg, filters = flt, multiple = TRUE)
  # }
}
# verificando:
aa = lattes$find('{}')

1.5.3 Um pequeno resumo dos resultados

Agora vamos realizar um pequeno teste para ver a quantidade de entradas para cada tipo de informação possível em cada quantil.

# resumo dos resultados:
# mostra quantos jornais em cada categoria
mpred <- lattes$mapreduce(map = 'function(){
                                 var sci = this.scimago;
                                 for(i in sci){emit(sci[i],1);}}',
                          reduce = 'function(key, vals){
                           var count = 0;
                           for(i in vals){count  += vals[i];}
                           return count;}')
head(mpred)
##        _id value
## 1 16764188     2
## 2 03914097     1
## 3 15167275     1
## 4 18097790     2
## 5 00153826     7
## 6 10111344     5

1.5.4 Verificando algumas infos

Aqui vamos apenas verificar quantas publicações listadas no banco lattes estão presentes nos rankings elaborados pelo Scimago.

# verficando quantos do lattes estão no scimago
ISSNLattes = unlist(lattes$distinct("ISSNcodes"))
ISSNScimago = unlist(scimagodb$distinct("ISSN"))

teste = sapply(ISSNLattes, function(x) x %in% ISSNScimago)
table(teste)
## teste
## FALSE  TRUE 
##  3701  3057

1.6 Criando um shiny app para ajudar na visualização dos dados

Como o tamanho da amostra de currículos de testes sendo analisada aumentou, identificar problemas na hora de verificar as informações contidas neles, seja por falta de dados ou erro de preenchimento do usuário do Lattes, seja por algum erro na hora de compilar os JSONs, se tornou tarefa um pouco trabalhosa se feita “manualmente”. Isso se deve porque algumas informações acabaram sendo compiladas com formatação errada e o Mongo não gosta do que aparece.

Assim, para facilitar a visualização dos dados e nos auxiliar na hora de encontrar problemas (e visando uma futura publicação dos resultados da pesquisa), resolvemos criar um shiny app.

No momento ele tem quatro abas. A primeira aba, que, se chama “Banco”, serve para uma visualização das variáveis dentro do banco. Acrescentamos a opção de selecionar até duas variáveis que queiramos isolar e analisar, além de botões para download das variáveis selecionadas, ou do banco inteiro.

A segunda aba, que se chama “Checkbox”, nós criamos uma listagem com todas as variáveis dentro do banco e apresentamos uma contagem de quantas entradas cada variável possui.

Na terceira aba, que se chama “Plots”, a ideia é criar gráficos que ajudem a visualizar as informações que estão sendo estudadas.

Na quarta aba, que se chama “Mapa”, a ideia é realizar a visualização das informações dentro de cada unidade da federação. No momento, apenas temos a quantidade de currículos cadastrados que trabalham dentro de alguma universidade nacional.

Observação: O aplicativo será disponibilizado em breve.

Shiny applications not supported in static R Markdown documents