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 .

Learn why MongoDB was selected as a leader in the 2024 Gartner® Magic Quadrant™
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

MongoDB Charts incorporando SDK com React

Maxime Beugnet5 min read • Published Oct 20, 2021 • Updated Sep 09, 2024
ReactAtlasCharts
Ícone do FacebookÍcone do Twitterícone do linkedin
Função do Realm
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Alguns recursos mencionados abaixo serão descontinuados em 30, 2025 de setembro. Saiba mais.

Introdução

Na postagem de blog anterior desta série, criamos um site da React que estava recuperando uma lista de países usando o Axios e uma REST API hospedada no MongoDB Realm.
Nesta publicação do blog, continuaremos a desenvolver esta base e a criar um painel com gráficosCOVID-19 , criado com oMongoDB Charts e incorporado em um website React com o SDK de Incorporação do MongoDB Charts.
Para adicionar um pouco de tempero à mistura, usaremos nossa lista de países para criar um filtro dinâmico para que possamos filtrar todos os gráficos de COVID-19 por país.
Você pode ver o resultado final aqui que hospedei em um aplicativoMongoDB Realm usando o recurso de hospedagem estática disponível.
Site final

Pré-requisitos

O código deste projeto está disponível no Github neste repositório.
1git clone git@github.com:mongodb-developer/mongodb-charts-embedded-react.git
Para executar este projeto, você precisará do node e npm em uma versão recente. Aqui está o que estou usando atualmente:
1$ node -v
2v14.17.1
3$ npm -v
48.0.0
Você pode executar o projeto localmente da seguinte forma:
1$ cd mongodb-realm-react-charts
2$ npm install
3$ npm start
Nas próximas seções desta postagem do blog, explicarei o que precisamos fazer para que este projeto funcione.

Criar um dashboard de MongoDB Charts

Antes de podermos incorporar nossos gráficos em nosso site React personalizado, precisamos criá-los no MongoDB Charts.
Aqui está o link para o painel que criei para este site. Se parece com isso.
Painel no MongoDB Charts
Se você quiser usar os mesmos dados que eu, confira esta publicação do blog sobre o Projeto Open Data CLI-19 e, especialmente , esta seção para duplicar os dados em seu próprio cluster no MongoDB Atlas.
Como você pode ver no painel, meus gráficos não são filtrados por país aqui. Você pode encontrar os dados de todos os países nos quatro gráficos que criei.

Ativar a filtragem e a incorporação

Para habilitar a filtragem quando estou incorporando meus gráficos em meu site, devo informar ao MongoDB Charts por qual(is) campo(s) poderei filtrar, com base nos campos disponíveis em minha coleção. Aqui, optei por filtrar por um único campo, country, e habilitei o acesso não autenticado para esta postagem pública no blog (veja abaixo).
Incorporar menu no MongoDB Charts
No campo User Specified Filters, adicionei country e optou por usar a opção JavaScript SDK em vez da alternativa iFrame que é menos conveniente de usar em um site React com filtros dinâmicos.
Incorporando o menu nos meus gráficos
Para cada um dos quatro gráficos, preciso recuperar o Charts Base URL (exclusivo para um painel) e o Charts IDs.
Agora que temos tudo o que precisamos, podemos ir para o código React.

Site do React

SDK de incorporação do MongoDB Charts

Comecemos pelo princípio: precisamos instalar o MongoDB Charts Embedding SDK em nosso projeto.
1npm i @mongodb-js/charts-embed-dom
Ele já está feito no projeto que forneci acima, mas não é feito se você estiver seguindo desde a primeira postagem do blog.

Projeto React

Meu projeto React é feito com apenas dois componentes de função: Dashboard e Chart.
A raiz index.jsdo projeto está apenas chamando o componente de funçãoDashboard.
1import React from 'react';
2import ReactDOM from 'react-dom';
3import Dashboard from "./Dashboard";
4
5ReactDOM.render(<React.StrictMode>
6 <Dashboard/>
7</React.StrictMode>, document.getElementById('root'));
O Dashboard é a peça central do projeto:
1import './Dashboard.css';
2import {useEffect, useState} from "react";
3import axios from "axios";
4import Chart from "./Chart";
5
6const Dashboard = () => {
7 const url = 'https://webhooks.mongodb-stitch.com/api/client/v2.0/app/covid-19-qppza/service/REST-API/incoming_webhook/metadata';
8 const [countries, setCountries] = useState([]);
9 const [selectedCountry, setSelectedCountry] = useState("");
10 const [filterCountry, setFilterCountry] = useState({});
11
12 function getRandomInt(max) {
13 return Math.floor(Math.random() * max);
14 }
15
16 useEffect(() => {
17 axios.get(url).then(res => {
18 setCountries(res.data.countries);
19 const randomCountryNumber = getRandomInt(res.data.countries.length);
20 let randomCountry = res.data.countries[randomCountryNumber];
21 setSelectedCountry(randomCountry);
22 setFilterCountry({"country": randomCountry});
23 })
24 }, [])
25
26 useEffect(() => {
27 if (selectedCountry !== "") {
28 setFilterCountry({"country": selectedCountry});
29 }
30 }, [selectedCountry])
31
32 return <div className="App">
33 <h1 className="title">MongoDB Charts</h1>
34 <h2 className="title">COVID-19 Dashboard with Filters</h2>
35 <div className="form">
36 {countries.map(c => <div className="elem" key={c}>
37 <input type="radio" name="country" value={c} onChange={() => setSelectedCountry(c)} checked={c === selectedCountry}/>
38 <label htmlFor={c} title={c}>{c}</label>
39 </div>)}
40 </div>
41 <div className="charts">
42 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'6e3cc5ef-2be2-421a-b913-512c80f492b3'}/>
43 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'be3faa53-220c-438f-aed8-3708203b0a67'}/>
44 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'7ebbba33-a92a-46a5-9e80-ba7e8f3b13de'}/>
45 <Chart height={'600px'} width={'800px'} filter={filterCountry} chartId={'64f3435e-3b83-4478-8bbc-02a695c1a8e2'}/>
46 </div>
47 </div>
48};
49
50export default Dashboard;
Ele é responsável por algumas coisas:
  • Linha 17 - Recupere a lista de países da REST API usando Axios (consulte a postagem anterior do blog).
  • Linhas 18-22 - Selecione um país aleatório na lista para o valor inicial.
  • Linhas 22 e 26 - Atualizam o filtro quando um novo valor é selecionado (aleatório ou manual).
  • Linha 32 counties.map(...) - Use a lista de países para construir uma lista de botões de opção para atualizar o filtro.
  • Linha 32 <Charts .../> x4 - Chame o componenteChart uma vez para cada gráfico com os acessórios apropriados, incluindo o filtro e a ID do gráfico.
Como você deve ter notado aqui, estou usando o mesmo filtro fitlerCountry para todos os gráficos, mas nada me impede de usar um filtro personalizado para cada gráfico.
Você também deve ter notado um arquivo CSS bem minimalista Dashboard.css. Aqui está:
1.title {
2 text-align: center;
3}
4
5.form {
6 border: solid black 1px;
7}
8
9.elem {
10 overflow: hidden;
11 display: inline-block;
12 width: 150px;
13 height: 20px;
14}
15
16.charts {
17 text-align: center;
18}
19
20.chart {
21 border: solid #589636 1px;
22 margin: 5px;
23 display: inline-block;
24}
O componenteChart tem esta aparência:
1import React, {useEffect, useRef, useState} from 'react';
2import ChartsEmbedSDK from "@mongodb-js/charts-embed-dom";
3
4const Chart = ({filter, chartId, height, width}) => {
5 const sdk = new ChartsEmbedSDK({baseUrl: 'https://charts.mongodb.com/charts-open-data-covid-19-zddgb'});
6 const chartDiv = useRef(null);
7 const [rendered, setRendered] = useState(false);
8 const [chart] = useState(sdk.createChart({chartId: chartId, height: height, width: width, theme: "dark"}));
9
10 useEffect(() => {
11 chart.render(chartDiv.current).then(() => setRendered(true)).catch(err => console.log("Error during Charts rendering.", err));
12 }, [chart]);
13
14 useEffect(() => {
15 if (rendered) {
16 chart.setFilter(filter).catch(err => console.log("Error while filtering.", err));
17 }
18 }, [chart, filter, rendered]);
19
20 return <div className="chart" ref={chartDiv}/>;
21};
22
23export default Chart;
O componenteChartnão está fazendo muita coisa. É responsável apenas por renderizar o gráfico uma vez quando a página é carregada e recarregar o gráfico se o filtro for atualizado para exibir os dados corretos (graças ao React).
Observe que o segundo useEffect (com a chamadachart.setFilter(filter)) não deve ser executado se o gráfico não tiver sido renderizado. Portanto, ele é protegido pelo estadorenderedque só é definido como true quando o gráfico é renderizado na tela.
E pronto! Se tudo correu como planejado, você deve acabar com um site (não muito) bonito como este.

Conclusão

Nesta publicação do blog, você aprenderá como incorporar MongoDB Charts em um siteReact usando o MongoDB Charts Embedding SDK.
Também aprenderam como criar filtros dinâmicos para os Atlas Charts usando useEffect().
Não aprenderam como proteger os Charts com um token de autenticação, mas você pode aprender como fazer isso nesta documentação.
Se tiver dúvidas, acesse o site da nossa comunidade de desenvolvedores, no qual os engenheiros e a comunidade do MongoDB ajudarão você a desenvolver sua próxima grande ideia com o MongoDB.

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

Realm Atlas Triggers Mimos e Triggers - Agendamento trigger baseado em documentos


Sep 09, 2024 | 5 min read
Tutorial

Integre os registros do Atlas Application Services no Datadog na AWS


Sep 09, 2024 | 2 min read
Tutorial

Além do básico: aprimorando a API Kotlin Ktor com pesquisa vetorial


Sep 18, 2024 | 9 min read
Tutorial

Introdução ao MongoDB Atlas e ao Azure Functions usando Node.js


Feb 03, 2023 | 8 min read
Sumário