Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Saiba por que o MongoDB foi selecionado como um líder no 2024 Gartner_Magic Quadrupnt()
Desenvolvedor do MongoDB
Centro de desenvolvedores do MongoDB
chevron-right
Produtos
chevron-right
MongoDB
chevron-right

Série temporal MongoDB com C++

Rishabh Bisht6 min read • Published Feb 10, 2023 • Updated Sep 17, 2024
MongoDBTime SeriesC++
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Bibliotecas usadas neste tutorial:
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.

Pré-requisitos

  1. Conta do MongoDB Atlas com um cluster criado.
  2. 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.
  3. 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.
  4. 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.

Instalação: bibliotecas

Inicie o powershell/terminal como administrador e execute os comandos compartilhados abaixo.
Etapa 1: instalar o vcpkg.
1git clone https://github.com/Microsoft/vcpkg.git
2cd vcpkg
3./bootstrap-vcpkg.sh
4./vcpkg integrate install
Etapa 2: Instale libcpr/cpr.
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
2find_package(cpr CONFIG REQUIRED)
3target_link_libraries(main PRIVATE cpr::cpr)

Criando o aplicativo

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

Funções auxiliares

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.
Definindo variáveis de ambiente no Microsoft Visual Studio
  • “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
16using namespace std;
17
18
19std::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
39int 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
58void 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}

A função main()

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”.
1int 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.
Aplicativo Monitor AQI em C++ com séries temporais MongoDB
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.
Série temporal MongoDB no MongoDB Atlas

Visualizando os dados com o MongoDB Charts

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.
Selecionando a fonte de dados para o MongoDB Charts
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.
MongoDB Charts com série temporal
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 ".
MongoDB Charts com série temporal
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.
Opções de formatação no MongoDB Charts
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:
Painel do MongoDB Charts
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.
Configurações de atualização do MongoDB Charts

Conclusão

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!

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Artigo

Análise de moeda com coleções de séries temporais # 3 — Cálculo de MACD e RSI


Sep 11, 2024 | 8 min read
Artigo

Definir preocupações globais de leitura e gravação no MongoDB 4.4


Sep 23, 2022 | 7 min read
Tutorial

Queries de pipeline de agregação do MongoDB versus queries SQL


May 10, 2022 | 7 min read
Tutorial

Construindo com padrões: o padrão computado


May 16, 2022 | 3 min read
Sumário