Série temporal MongoDB com C++
Avalie esse Tutorial
{9IoT} MongoDB C++ MongoDB Dados de série temporal são um conjunto de pontos de dados coletados em intervalos regulares. É um caso de uso comum em muitos setores, como financeiro, e comunicações. fornece recursos poderosos para lidar com dados de séries temporais e, neste tutorial, mostraremos como construir um aplicativo de console que usa o para armazenar dados de séries temporais, relacionados ao Índice de qualidade do ar (AQI) para um determinado local. Também daremos uma olhada MongoDB Charts nos para visualizar os dados salvos na série temporal.
Bibliotecas usadas neste tutorial:
- Padrão de linguagem: C++17
Este tutorial utiliza o Microsoft Windows 11 e o Microsoft Visual Studio 2022, mas o código utilizado neste tutorial deve funcionar em qualquer sistema operacional e IDE, com pequenas alterações.
- Conta do MongoDB Atlas com um cluster criado.
- Configuração do Microsoft Visual Studio com o driver MongoDB C e C++ instalado. Siga as instruções em Introdução ao MongoDB e C++ para instalar os drivers do MongoDB C/C++ e configurar o ambiente de desenvolvimento no Visual Studio.
- O endereço IP da sua máquina está na lista de permissões. Nota: Você pode adicionar 0.0.0.0/0 como o endereço IP, que deve permitir o acesso de qualquer máquina. Essa configuração não é recomendada para uso em produção.
- O token da API é gerado usando o Formulário de Solicitação de Token da API da Air Quality Open Data Platform para buscar o AQI para um determinado local.
Inicie o powershell/terminal como administrador e execute os comandos compartilhados abaixo.
1 git clone https://github.com/Microsoft/vcpkg.git 2 cd vcpkg 3 ./bootstrap-vcpkg.sh 4 ./vcpkg integrate install
1 ./vcpkg install cpr:x64-windows
Este tutorial pressupõe que estamos trabalhando com arquitetura x64 . Se você estiver direcionando x86, use este comando:
1 ./vcpkg install cpr
Observação: o aviso abaixo (se encontrado) pode ser ignorado.
1 # this is heuristically generated, and may not be correct 2 find_package(cpr CONFIG REQUIRED) 3 target_link_libraries(main PRIVATE cpr::cpr)
Código fonte disponível aqui
Neste tutorial, construiremos um monitorde Índice de qualidade do ar (AQI) que salvará o AQI de um determinado local em uma coleção de séries temporais.
O AQI é uma medida da qualidade do ar em uma determinada área, com números mais altos indicando pior qualidade do ar. O AQI é baseado em uma escala de 0 a 500 e é calculado com base nos níveis de vários agentes poluidores no ar.
Vamos construir um aplicativo de console do zero. Siga as etapas sobre como configurar o ambiente de desenvolvimento no Visual Studio de nosso artigo anterior Introdução ao MongoDB e C++, na seção "Visual Studio: Setting up the dev environment. "
Depois de configurarmos uma solução do Visual Studio, vamos começar a adicionar os cabeçalhos necessários e a escrever as funções auxiliares.
- Certifique-se de incluir
<cpr/cpr.h>
para acessar os métodos fornecidos pela bibliotecacpr.
Observação: como instalamos a biblioteca cpr com vcpkg, ela adiciona automaticamente os caminhos de inclusão e as dependências necessários ao Visual Studio.
- Obtenha a cadeia de conexão (URI) para o cluster e crie uma nova variável de ambiente com chave como
“MONGODB_URI”
e valor como a cadeia de conexão (URI). É uma boa prática manter a connection string dissociada do código. Da mesma forma, salve o token de API obtido na seção Pré-requisitos com a chave como“AQICN_TOKEN”
.
Navegue até o painel Solution Explorer, clique com o botão direito do mouse no nome da solução e clique em “Properties.” Go para Configuration Properties > Debugging > Environment para adicionar essas variáveis de ambiente conforme mostrado abaixo.
“getAQI”
A função faz uso da bibliotecacpr para fazer uma chamada para a API REST, buscando os dados AQI. A resposta à solicitação é então analisada para obter o valor da AQI.- A função
“saveToCollection”
salva a figura de AQI fornecida na coleção de séries temporais. Observe que adicionar o par de valores-chave“timestamp”
é obrigatório. Um carimbo de data/hora ausente fará com que uma exceção seja lançada. Confira diferentes“timeseries”
Campos de objeto em Criar e consultar uma coleção de séries temporais — Manual do MongoDB.
1 #pragma once 2 3 4 #include <mongocxx/client.hpp> 5 #include <bsoncxx/builder/list.hpp> 6 #include <bsoncxx/builder/stream/document.hpp> 7 #include <bsoncxx/json.hpp> 8 #include <mongocxx/uri.hpp> 9 #include <mongocxx/instance.hpp> 10 11 12 #include <iostream> 13 #include <cpr/cpr.h> 14 15 16 using namespace std; 17 18 19 std::string getEnvironmentVariable(std::string environmentVarKey) 20 { 21 char* pBuffer = nullptr; 22 size_t size = 0; 23 auto key = environmentVarKey.c_str(); 24 25 // Use the secure version of getenv, ie. _dupenv_s to fetch environment variable. 26 if (_dupenv_s(&pBuffer, &size, key) == 0 && pBuffer != nullptr) 27 { 28 std::string environmentVarValue(pBuffer); 29 free(pBuffer); 30 return environmentVarValue; 31 } 32 else 33 { 34 return ""; 35 } 36 } 37 38 39 int getAQI(std::string city, std::string apiToken) 40 { 41 // Call the API to get the air quality index. 42 std::string aqiUrl = "https://api.waqi.info/feed/" + city + "/?token=" + apiToken; 43 auto aqicnResponse = cpr::Get(cpr::Url{ aqiUrl }); 44 45 46 // Get the AQI from the response 47 if(aqicnResponse.text.empty()) 48 { 49 cout << "Error: Response is empty." << endl; 50 return -1; 51 } 52 bsoncxx::document::value aqicnResponseBson = bsoncxx::from_json(aqicnResponse.text); 53 auto aqi = aqicnResponseBson.view()["data"]["aqi"].get_int32().value; 54 return aqi; 55 } 56 57 58 void saveToCollection(mongocxx::collection& collection, int aqi) 59 { 60 auto timeStamp = bsoncxx::types::b_date(std::chrono::system_clock::now()); 61 62 63 bsoncxx::builder::stream::document aqiDoc = bsoncxx::builder::stream::document{}; 64 aqiDoc << "timestamp" << timeStamp << "aqi" << aqi; 65 collection.insert_one(aqiDoc.view()); 66 67 68 // Log to the console window. 69 cout << " TimeStamp: " << timeStamp << " AQI: " << aqi << endl; 70 }
Com todas as funções auxiliares no lugar, vamos escrever a função principal que conduzirá este aplicativo.
- A função principal cria/obtém a collection de séries temporais especificando o
“collection_options”
para o método“create_collection”
. Observação: o MongoDB cria collections implicitamente quando você faz referência à collection pela primeira vez em um comando; no entanto, uma collection de séries temporais precisa ser criada explicitamente com "create_collection ". - A cada 30 minutos, o programa obtém o valor do AQI e o atualiza na coleção de séries temporais. Sinta-se à vontade para modificar o intervalo de tempo conforme sua preferência, alterando o valor passado para
“sleep_for”
.
1 int main() 2 { 3 // Get the required parameters from environment variable. 4 auto mongoURIStr = getEnvironmentVariable("MONGODB_URI"); 5 auto apiToken = getEnvironmentVariable("AQICN_TOKEN"); 6 std::string city = "Delhi"; 7 static const mongocxx::uri mongoURI = mongocxx::uri{ mongoURIStr }; 8 9 10 if (mongoURI.to_string().empty() || apiToken.empty()) 11 { 12 cout << "Invalid URI or API token. Please check the environment variables." << endl; 13 return 0; 14 } 15 16 17 // Create an instance. 18 mongocxx::instance inst{}; 19 mongocxx::options::client client_options; 20 auto api = mongocxx::options::server_api{ mongocxx::options::server_api::version::k_version_1 }; 21 client_options.server_api_opts(api); 22 mongocxx::client conn{ mongoURI, client_options }; 23 24 25 // Setup Database and Collection. 26 const string dbName = "AQIMonitor"; 27 const string timeSeriesCollectionName = "AQIMonitorCollection"; 28 29 30 // Setup Time Series collection options. 31 bsoncxx::builder::document timeSeriesCollectionOptions = 32 { 33 "timeseries", 34 { 35 "timeField", "timestamp", 36 "granularity", "minutes" 37 } 38 }; 39 40 41 auto aqiMonitorDB = conn[dbName]; 42 auto aqiMonitorCollection = aqiMonitorDB.has_collection(timeSeriesCollectionName) 43 ? aqiMonitorDB[timeSeriesCollectionName] 44 : aqiMonitorDB.create_collection(timeSeriesCollectionName, timeSeriesCollectionOptions.view().get_document().value); 45 46 47 // Fetch and update AQI every 30 minutes. 48 while (true) 49 { 50 auto aqi = getAQI(city, apiToken); 51 saveToCollection(aqiMonitorCollection, aqi); 52 std::this_thread::sleep_for(std::chrono::minutes(30)); 53 } 54 55 56 return 0; 57 }
Quando esse aplicativo é executado, você pode ver a atividade abaixo na janela do console.
Você também pode ver a coleção de séries temporais no Atlas refletindo qualquer alteração feita por meio do aplicativo de console.
Podemos usar o MongoDB Charts para visualizar os dados de AQI e executar a agregação sobre eles.
Step 1: Go to MongoDB Charts e clique em "Add Dashboard " para criar um novo painel - nomeie-o de "AQI Monitor ".
Passo 2: Clique em “Add Chart”.
Etapa 3: Na caixa de diálogo "Select Data Source ", Go para a aba "Project " e navegue até a coleção de séries temporais criada pelo nosso código.
Etapa 4: altere o tipo de gráfico para "Continuous Line ". Usaremos este gráfico para exibir as tendências da AQI ao longo do tempo.
Etapa 5: Arraste e solte os campos "timestamp " e "aqi " para o eixo X e o eixo Y, respectivamente. Você pode personalizar a aparência (como rótulos, cores e formato de dados) na guia "Customize". Clique em "Save and close " para salvar o gráfico.
Passo 6: Vamos adicionar outro gráfico para exibir o AQI máximo - clique em "Add Chart" e selecione a mesma fonte de dados de antes.
Etapa 7: altere o tipo de gráfico para "Number ".
Etapa 8: Arraste e solte o campo "aqi " em "Aggregation " e altere Agregado para "MAX ".
Passo 9: Podemos personalizar o texto do gráfico para mudar a cor com base nos valores de AQI. Vamos deixar o texto verde se o AQI for menor ou igual a 100 e vermelho se não o fizer. Podemos executar esta ação com a opção de formatação condicional na guia Personalizar.
Passo 10: Da mesma forma, podemos adicionar gráficos para AQI mínimo e médio. O painel deve finalmente ter a seguinte aparência:
Dica: Altere as configurações de atualização automática do botão "Refresh settings " para escolher um intervalo de tempo de atualização de sua escolha para os gráficos.
Com este artigo, abordamos a criação de um aplicativo em C++ que escreve dados em uma coleção de séries temporais do MongoDB e os usamos ainda mais para criar um painel do MongoDB Charts para visualizar os dados de forma significativa. O aplicativo pode ser expandido para salvar outros parâmetros, como PM2.5 e temperatura.
Agora que você aprenderá a criar um aplicativo usando o driver C++ do MongoDB e a série temporal do MongoDB, teste suas novas habilidades criando seu próprio aplicativo exclusivo. Compartilhe sua criação com a comunidade e conte para nós como ficou!