{"id":50770,"date":"2022-06-27T04:05:06","date_gmt":"2022-06-27T07:05:06","guid":{"rendered":"https:\/\/kinqsta.com\/pt\/?p=50770&#038;post_type=knowledgebase&#038;preview_id=50770"},"modified":"2025-10-01T17:04:13","modified_gmt":"2025-10-01T20:04:13","slug":"o-que-e-mongodb","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/","title":{"rendered":"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto"},"content":{"rendered":"<p><span style=\"font-size: 1rem\">Este tutorial apresenta o banco de dados MongoDB. Voc\u00ea aprender\u00e1 como instalar o software, manipular dados e aplicar t\u00e9cnicas de design de dados em seus pr\u00f3prios aplicativos.<\/span><\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Todos os exemplos foram desenvolvidos usando o MongoDB 5, mas a maioria funcionar\u00e1 em vers\u00f5es anteriores ou posteriores. O c\u00f3digo pode ser inserido diretamente em um aplicativo cliente ou no shell do MongoDB (mongo ou mongosh) para consultar e atualizar o banco de dados.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>O que \u00e9 MongoDB?<\/h2>\n<p>O MongoDB \u00e9 um <a href=\"https:\/\/kinqsta.com\/pt\/blog\/banco-de-dados-de-codigo-aberto\/\">banco de dados de c\u00f3digo aberto NoSQL<\/a>. NoSQL significa que o banco de dados n\u00e3o utiliza tabelas relacionais como um <a href=\"https:\/\/kinqsta.com\/pt\/blog\/mongodb-vs-mysql\/\">banco de dados SQL tradicional<\/a>.<\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Existem diversos tipos de bancos de dados NoSQL, mas o MongoDB armazena dados em objetos semelhantes a JavaScript chamados de <em>documentos<\/em>, cujo conte\u00fado se parece com isso:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">{\n  _id: \"123\",\n  name: \"Craig\"\n}<\/code><\/pre>\n<p><br \/>\nEmbora MongoDB tenha se tornado sin\u00f4nimo do framework baseado em JavaScript <a href=\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-node-js\/\">Node.js<\/a>, os <a href=\"https:\/\/www.mongodb.com\/docs\/drivers\/\" target=\"_blank\" rel=\"noopener noreferrer\">drivers<\/a> oficiais do MongoDB est\u00e3o dispon\u00edveis para a maioria dos frameworks, linguagens e tempos de execu\u00e7\u00e3o, incluindo <a href=\"https:\/\/www.mongodb.com\/docs\/drivers\/node\/current\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js<\/a>, <a href=\"https:\/\/kinqsta.com\/pt\/blog\/php-vs-python\/\">PHP e Python<\/a>. Voc\u00ea tamb\u00e9m pode optar por bibliotecas como <a href=\"https:\/\/www.npmjs.com\/package\/mongoose\" target=\"_blank\" rel=\"noopener noreferrer\">Mongoose<\/a> que oferecem um n\u00edvel mais elevado de abstra\u00e7\u00e3o ou recursos de mapeamento relacional de objetos (ORM).<\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Ao contr\u00e1rio das tabelas SQL, n\u00e3o existem limites estruturais sobre o que voc\u00ea pode armazenar no MongoDB. Os esquemas de dados n\u00e3o s\u00e3o impostos: voc\u00ea pode armazenar o que quiser onde quiser. Isso torna o MongoDB ideal para estruturas de dados mais org\u00e2nicas &#8211; ou confusas.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Considere um livro de endere\u00e7os de contatos. \u00c9 comum que os indiv\u00edduos tenham v\u00e1rios n\u00fameros de telefone. Voc\u00ea poderia definir tr\u00eas campos de telefone na tabela SQL, isso pode ser insuficiente para alguns contatos e excessivo para outros. No final, voc\u00ea precisaria de uma tabela separada de telefone, o que adiciona mais complexidade.<\/p>\n<p>No MongoDB, esses n\u00fameros de telefones poderiam ser definidos como um conjunto ilimitado de objetos no mesmo documento:<\/p>\n<pre><code class=\"language-bash\">{\n  _id: \"123\",\n  name: \"Craig\",\n  telephone: [\n    { home: \"0123456789\" },\n    { work: \"9876543210\" },\n    { cell: \"3141592654\" }\n  ]\n}<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Observe que o MongoDB usa uma nota\u00e7\u00e3o de objeto JavaScript semelhante para atualiza\u00e7\u00f5es e consultas de dados, o que pode representar alguns desafios se voc\u00ea estiver acostumado com o SQL.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2>Elementos do MongoDB<\/h2>\n<p>Antes de continuarmos, daremos uma olhada no que faz o MongoDB funcionar. Usaremos este vocabul\u00e1rio ao longo deste artigo.<\/p>\n<ul>\n<li><strong>Documento:<\/strong> Um objeto individual em um banco de dados, an\u00e1logo a um registro ou linha em uma tabela de banco de dados SQL.<\/li>\n<li><strong>Campo:<\/strong> Um \u00fanico item de dados dentro de um documento, como um nome ou n\u00famero de telefone, an\u00e1logo a um campo ou coluna de tabela SQL.<\/li>\n<li><strong>Cole\u00e7\u00e3o:<\/strong> Um conjunto de documentos semelhantes, an\u00e1logo a uma tabela SQL. Embora seja poss\u00edvel colocar todos os documentos em uma \u00fanica cole\u00e7\u00e3o, geralmente \u00e9 mais pr\u00e1tico agrup\u00e1-los em tipos espec\u00edficos. Em um livro de endere\u00e7os de contatos, voc\u00ea poderia ter uma &#8220;person collection&#8221; e outra para empresas.<\/li>\n<li><strong>Banco de dados:<\/strong> Uma cole\u00e7\u00e3o de dados relacionados, id\u00eanticos em significado a um banco de dados SQL.<\/li>\n<li><strong>Schema:<\/strong> Um schema define estruturas de dados. Em bancos de dados SQL voc\u00ea deve definir defini\u00e7\u00f5es de tabelas com campos e tipos associados antes de poder armazenar dados. Isso n\u00e3o \u00e9 necess\u00e1rio no MongoDB, embora seja poss\u00edvel criar um schema que valide documentos antes que eles possam ser adicionados a uma cole\u00e7\u00e3o.<\/li>\n<li><strong>\u00cdndice:<\/strong> Uma estrutura de dados usada para melhorar o desempenho de consultas, com o mesmo significado que \u00edndices SQL.<\/li>\n<li><strong>Chave prim\u00e1ria:<\/strong> Um identificador \u00fanico para cada documento. MongoDB automaticamente adiciona um campo _id \u00fanico e indexado a cada documento de uma cole\u00e7\u00e3o.<\/li>\n<li><strong>Desnormaliza\u00e7\u00e3o:<\/strong> Em bancos de dados SQL, \u201cnormaliza\u00e7\u00e3o\u201d \u00e9 uma t\u00e9cnica usada para organizar e eliminar dados duplicados. No MongoDB, embora n\u00e3o seja recomendado, a &#8220;desnormaliza\u00e7\u00e3o&#8221; pode ser usada em determinadas situa\u00e7\u00f5es para melhorar o desempenho da consulta. Isso envolve a repeti\u00e7\u00e3o ativa de dados, permitindo que um \u00fanico documento contenha todas as informa\u00e7\u00f5es necess\u00e1rias.<\/li>\n<li><strong>Join:<\/strong> SQL fornece um <a href=\"https:\/\/kinqsta.com\/pt\/blog\/operadores-mongodb\/\">operador<\/a> JOIN para que os dados possam ser recuperados de m\u00faltiplas tabelas normalizadas em uma \u00fanica consulta. A JOIN n\u00e3o era poss\u00edvel no MongoDB at\u00e9 a vers\u00e3o 3.6 e as limita\u00e7\u00f5es permanecem. Esta \u00e9 outra raz\u00e3o pela qual os dados devem ser desnormalizados em documentos autocontidos.<\/li>\n<li><strong>Transa\u00e7\u00f5es:<\/strong> Quando uma atualiza\u00e7\u00e3o muda dois ou mais valores em um \u00fanico documento, o MongoDB garante que todos eles tenham sucesso ou que todos falhem. As atualiza\u00e7\u00f5es em dois ou mais documentos devem ser embrulhadas em uma transa\u00e7\u00e3o. O MongoDB tem suportado transa\u00e7\u00f5es desde a vers\u00e3o 4.0, mas uma r\u00e9plica multi-servidor ou um cluster fragmentado \u00e9 necess\u00e1rio. As instala\u00e7\u00f5es de exemplo abaixo usam um \u00fanico servidor para que as transa\u00e7\u00f5es n\u00e3o sejam poss\u00edveis.<\/li>\n<\/ul>\n<h2>Como instalar o MongoDB<\/h2>\n<p><span style=\"font-size: 1rem\">Voc\u00ea tem tr\u00eas op\u00e7\u00f5es para usar o MongoDB em sua m\u00e1quina local. Vamos gui\u00e1-lo atrav\u00e9s de cada uma delas.<\/span><\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>1. Use o Docker (Recomendado)<\/h3>\n<p><a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker<\/a> \u00e9 uma ferramenta de gerenciamento de software que pode instalar, configurar e executar o MongoDB ou qualquer outro aplicativo em minutos.<\/p>\n<p><a href=\"https:\/\/dockerwebdev.com\/tutorials\/install-docker\/\" target=\"_blank\" rel=\"noopener noreferrer\">Instale Docker e Docker Compose<\/a> e, em seguida, crie uma pasta de projeto com um \u00fanico arquivo chamado docker-compose.yml contendo o seguinte conte\u00fado (note que as indenta\u00e7\u00f5es s\u00e3o essenciais):<\/p>\n<pre><code class=\"language-bash\">version: '3'\n\nservices:\n\n  mongodb:\n    image: mongo:5\n    environment:\n      - MONGO_INITDB_ROOT_USERNAME=root\n      - MONGO_INITDB_ROOT_PASSWORD=pass\n      - MONGO_INITDB_DATABASE=mongodemo\n    container_name: mongodb\n    volumes:\n      - dbdata:\/data\/db\n    ports:\n      - \"27017:27017\"\n\n  adminer:\n    image: dehy\/adminer\n    container_name: adminer\n    depends_on:\n      - mongodb\n    ports:\n      - \"8080:80\"\n\nvolumes:\n  dbdata:<\/code><\/pre>\n<p>Acesse a pasta a partir da linha de comando e execute:<\/p>\n<pre><code class=\"language-bash\">docker-compose up<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>A vers\u00e3o mais recente do MongoDB 5 ser\u00e1 baixada e iniciada. Isso levar\u00e1 alguns minutos na primeira vez, mas as execu\u00e7\u00f5es subsequentes s\u00e3o consideravelmente mais r\u00e1pidas.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Note que:<\/p>\n<ul>\n<li>Uma conta de administrador do MongoDB \u00e9 definida com o ID \u201croot\u201d e senha \u201cpass\u201d.<\/li>\n<li>Os dados s\u00e3o salvos entre as reinicializa\u00e7\u00f5es em um volume de Docker chamado dbdata.<\/li>\n<li>O <a href=\"https:\/\/kinqsta.com\/pt\/blog\/adminer\/\">cliente do banco de dados do Adminer<\/a> tamb\u00e9m \u00e9 fornecido.<\/li>\n<\/ul>\n<p>Voc\u00ea pode usar qualquer cliente de banco de dados MongoDB para se conectar ao localhost: 27017 usando o ID \u201croot\u201d e senha \u201cpass\u201d. Alternativamente, voc\u00ea pode acessar Adminer em <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/localhost:8080\/<\/a> e fazer o login com as seguintes credenciais:<\/p>\n<ul>\n<li><strong>Sistema:<\/strong> MongoDB (alfa)<\/li>\n<li><strong>Servidor:<\/strong> host.docker.internal<\/li>\n<li><strong>Nome de usu\u00e1rio:<\/strong> root<\/li>\n<li><strong>Senha:<\/strong> pass<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>O servidor host.docker.internal funcionar\u00e1 em dispositivos Mac e Windows rodando Docker Desktop. Usu\u00e1rios Linux devem usar o endere\u00e7o IP de rede do dispositivo, n\u00e3o o localhost (Adminer resolve isso para o seu pr\u00f3prio cont\u00eainer Docker)<\/p>\n<\/aside>\n\n<figure id=\"attachment_123495\" aria-describedby=\"caption-attachment-123495\" style=\"width: 900px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-123495\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/05\/adminer-login.png\" alt=\"Adminer login\" width=\"900\" height=\"455\"><figcaption id=\"caption-attachment-123495\" class=\"wp-caption-text\">Adminer login<\/figcaption><\/figure>\n<p>Adminer permite que voc\u00ea inspecione cole\u00e7\u00f5es e documentos. Esteja ciente, entretanto, que as cole\u00e7\u00f5es s\u00e3o referidas como \u201ctabelas\u201d:<\/p>\n<figure id=\"attachment_123494\" aria-describedby=\"caption-attachment-123494\" style=\"width: 1102px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-123494\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/05\/adminer-view.png\" alt=\"Adminer collection view\" width=\"1102\" height=\"577\"><figcaption id=\"caption-attachment-123494\" class=\"wp-caption-text\">Visualiza\u00e7\u00e3o da cole\u00e7\u00e3o Adminer.<\/figcaption><\/figure>\n<p>Para executar comandos, voc\u00ea pode usar o ambiente MongoDB Shell (<code>mongosh<\/code>) ou a linha de comando REPL (Read Eval Print Loop) do legado <code>mongo<\/code>.<\/p>\n<p>Acesse o shell bash do cont\u00eainer Docker MongoDB:<\/p>\n<pre><code class=\"language-bash\">docker exec -it mongodb bash<\/code><\/pre>\n<p>Em seguida, inicie o shell do MongoDB com o ID e senha:<\/p>\n<pre><code class=\"language-bash\">mongosh -u root -p pass<\/code><\/pre>\n<p>(O comando legado <code>mongo<\/code> pode ser usado se voc\u00ea preferir)<\/p>\n<p>Voc\u00ea pode ent\u00e3o emitir comandos MongoDB como os seguintes:<\/p>\n<ul>\n<li><strong><code>show dbs;<\/code><\/strong> &#8211; Mostrar todos os bancos de dados<\/li>\n<li><strong><code>use mongodemo;<\/code><\/strong> &#8211; Use um banco de dados espec\u00edfico<\/li>\n<li><strong><code>show collections;<\/code><\/strong> &#8211; Liste as cole\u00e7\u00f5es em um banco de dados<\/li>\n<li><strong><code>db.person.find();<\/code><\/strong> &#8211; Liste todos os documentos de uma cole\u00e7\u00e3o<\/li>\n<li><strong><code>exit;<\/code><\/strong> &#8211; Sair\/fechar o shell<\/li>\n<\/ul>\n<p>Desative o MongoDB executando o seguinte comando no diret\u00f3rio do projeto:<\/p>\n<pre><code class=\"language-bash\">docker-compose down<\/code><\/pre>\n<h3>2. Use um provedor de nuvens (sem instala\u00e7\u00e3o)<\/h3>\n<p><span style=\"font-size: 1rem\">Voc\u00ea pode usar uma inst\u00e2ncia hospedada do MongoDB, ent\u00e3o n\u00e3o \u00e9 necess\u00e1rio instalar nada localmente. Uma conex\u00e3o com a internet \u00e9 essencial e a velocidade de resposta depender\u00e1 do provedor de hospedagem e da sua largura de banda. A maioria dos servi\u00e7os ir\u00e1 cobrar uma taxa mensal e\/ou de uso em Megabytes.<\/span><\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>O provedor de hospedagem normalmente fornecer\u00e1 detalhes para que voc\u00ea possa administrar o banco de dados remotamente usando o software cliente MongoDB.<\/p>\n<h3>3. Instale MongoDB localmente<\/h3>\n<p>MongoDB pode ser instalado e configurado em Linux, Windows, ou Mac OS. Duas edi\u00e7\u00f5es est\u00e3o dispon\u00edveis:<\/p>\n<ol>\n<li>Uma edi\u00e7\u00e3o comercial Enterprise<\/li>\n<li>Uma edi\u00e7\u00e3o de c\u00f3digo aberto Community (usada neste tutorial)<\/li>\n<\/ol>\n<p>A <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/installation\/\" target=\"_blank\" rel=\"noopener noreferrer\">p\u00e1gina de instala\u00e7\u00e3o do MongoDB<\/a> fornece instru\u00e7\u00f5es para v\u00e1rios sistemas operacionais. Em geral:<\/p>\n<ul>\n<li>As edi\u00e7\u00f5es Linux s\u00e3o instaladas usando um gerenciador de pacotes como o <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/tutorial\/install-mongodb-on-ubuntu\/\" target=\"_blank\" rel=\"noopener noreferrer\">apt no Ubuntu<\/a><\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/tutorial\/install-mongodb-on-os-x\/\" target=\"_blank\" rel=\"noopener noreferrer\">As edi\u00e7\u00f5es do Mac OS s\u00e3o instaladas usando brew<\/a><\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/tutorial\/install-mongodb-on-windows\/\" target=\"_blank\" rel=\"noopener noreferrer\">As edi\u00e7\u00f5es do Windows s\u00e3o instaladas usando um instalador .msi<\/a><\/li>\n<\/ul>\n<p>Certifique-se de seguir as instru\u00e7\u00f5es cuidadosamente para que sua instala\u00e7\u00e3o seja bem-sucedida.<\/p>\n<h2>Como acessar o seu banco de dados MongoDB<\/h2>\n<p>Agora que o seu banco de dados MongoDB est\u00e1 instalado, \u00e9 hora de aprender como gerenci\u00e1-lo. Discutiremos o que voc\u00ea precisar\u00e1 fazer para acessar e trabalhar com o seu banco de dados.<\/p>\n<h3>1. Instale um cliente MongoDB<\/h3>\n<p>Um aplicativo cliente MongoDB \u00e9 necess\u00e1rio para administrar bancos de dados. Caso voc\u00ea esteja usando uma nuvem ou instala\u00e7\u00e3o local, recomendamos que voc\u00ea <a href=\"https:\/\/www.mongodb.com\/docs\/mongodb-shell\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">instale a linha de comando mongosh MongoDB Shell<\/a>.<\/p>\n<p><a href=\"https:\/\/www.adminer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Adminer<\/a> \u00e9 um cliente de banco de dados baseado na web que suporta o MongoDB, embora atualmente ele esteja limitado a inspecionar cole\u00e7\u00f5es. Adminer pode ser baixado como um \u00fanico script PHP, mas j\u00e1 est\u00e1 configurado se voc\u00ea usar a <a href=\"https:\/\/docs.google.com\/document\/d\/13hLswY74cFDedN7DoUWbIshf6K7wRI4myCvKcpvNIZ0\/edit#heading=h.jv0yfv8fhy7q\" target=\"_blank\" rel=\"noopener noreferrer\">instala\u00e7\u00e3o do Docker<\/a> ou tiver o <a href=\"https:\/\/kinqsta.com\/docs\/devkinsta\/database-manager\/\">DevKinsta instalado<\/a>.<\/p>\n<p>Um aplicativo cliente GUI fornece uma melhor interface para atualizar e inspecionar de dados. Existem v\u00e1rias op\u00e7\u00f5es dispon\u00edveis, incluindo o <a href=\"https:\/\/www.mongodb.com\/products\/compass\" target=\"_blank\" rel=\"noopener noreferrer\">MongoDB Compass,<\/a> que \u00e9 gratuito e multi-plataforma:<\/p>\n<figure id=\"attachment_123493\" aria-describedby=\"caption-attachment-123493\" style=\"width: 1315px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-123493\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/05\/compass.png\" alt=\"MongoDB Compass\" width=\"1315\" height=\"932\"><figcaption id=\"caption-attachment-123493\" class=\"wp-caption-text\">MongoDB Compass<\/figcaption><\/figure>\n<p>O <a href=\"https:\/\/studio3t.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Studio 3T<\/a>, outro concorrente da GUI, fornece um aplicativo comercial que concede funcionalidade limitada gratuitamente:<\/p>\n<figure id=\"attachment_123492\" aria-describedby=\"caption-attachment-123492\" style=\"width: 1266px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-123492\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2022\/05\/studio3t.png\" alt=\"Studio 3T\" width=\"1266\" height=\"905\"><figcaption id=\"caption-attachment-123492\" class=\"wp-caption-text\">Studio 3T<\/figcaption><\/figure>\n<p>Voc\u00ea pode acessar seu banco de dados MongoDB com uma dessas ferramentas usando qualquer uma das seguintes op\u00e7\u00f5es:<\/p>\n<ol>\n<li>O nome da rede da m\u00e1quina, URL, ou endere\u00e7o IP (<strong>localhost <\/strong>para uma instala\u00e7\u00e3o local).<\/li>\n<li>A porta MongoDB (<strong>27017 <\/strong>por padr\u00e3o).<\/li>\n<li>Um <strong>ID de <\/strong>usu\u00e1rio e uma <strong>senha<\/strong>. Um usu\u00e1rio root \u00e9 normalmente definido durante a instala\u00e7\u00e3o.<\/li>\n<\/ol>\n<h3>2. Defina e salve as credenciais de acesso ao banco de dados<\/h3>\n<p>O administrador root tem acesso ilimitado a todos os bancos de dados. Em geral, voc\u00ea deve usar um usu\u00e1rio personalizado com privil\u00e9gios espec\u00edficos para limitar o acesso e <a href=\"https:\/\/kinqsta.com\/pt\/blog\/seguranca-wordpres\/\">aumentar a seguran\u00e7a<\/a>.<\/p>\n<p>Por exemplo, o seguinte comando cria um usu\u00e1rio chamado <strong>myuser <\/strong>com a senha <strong>mypass <\/strong>que tem acesso de leitura e escrita ao banco de dados <strong>mydb:<\/strong><\/p>\n<pre><code class=\"language-bash\">use mydb;\n\ndb.createUser({\n  user: \"myuser\",\n  pwd: \"mypass\",\n  roles: [\n    { role: \"readWrite\", db: \"mydb\" }\n  ]\n});<\/code><\/pre>\n<h2>Como inserir novos documentos no MongoDB<\/h2>\n<p>N\u00e3o h\u00e1 necessidade de definir um banco de dados ou uma cole\u00e7\u00e3o antes de inserir seu primeiro documento. Usando qualquer cliente MongoDB, simplesmente mude para um banco de dados chamado mongodemo:<\/p>\n<pre><code class=\"language-bash\">use mongodemo;<\/code><\/pre>\n<p>Ent\u00e3o insira um \u00fanico documento em uma nova \u201cperson collection\u201d:<\/p>\n<pre><code class=\"language-bash\">db.person.insertOne(\n  {\n    name: 'Abdul',\n    company: 'Alpha Inc',\n    telephone: [\n      { home: '0123456789' },\n      { work: '9876543210' }\n    ]\n  }\n);<\/code><\/pre>\n<p>Veja o documento executando uma consulta para retornar todos os resultados da coleta da pessoa:<\/p>\n<pre><code class=\"language-bash\">db.person.find({});<\/code><\/pre>\n<p>O resultado ser\u00e1 algo parecido com isto:<\/p>\n<pre><code class=\"language-bash\">{\n  \"_id\" : ObjectId(\"62442429854636a03f6b8534\"),\n  name: 'Abdul',\n  company: 'Alpha Inc',\n  telephone: [\n    { home: '0123456789' },\n    { work: '9876543210' }\n  ]\n}<\/code><\/pre>\n<h3>Como inserir m\u00faltiplos documentos<\/h3>\n<p>Voc\u00ea pode inserir m\u00faltiplos documentos em uma cole\u00e7\u00e3o passando um array para <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.collection.insertMany\/\" target=\"_blank\" rel=\"noopener noreferrer\">inserirMany()<\/a>. O c\u00f3digo a seguir cria documentos pessoais adicionais e uma nova cole\u00e7\u00e3o da empresa:<\/p>\n<pre><code class=\"language-bash\">db.person.insertMany([\n  {\n    name: 'Brian',\n    company: 'Beta Inc'\n  },\n  {\n    name: 'Claire',\n    company: 'Gamma Inc',\n    telephone: [\n      { cell: '3141592654' }\n    ]\n  },\n  {\n    name: 'Dawn',\n    company: 'Alpha Inc'\n  },\n  {\n    name: 'Esther',\n    company: 'Beta Inc',\n    telephone: [\n      { home: '001122334455' }\n    ]\n  },\n  {\n    name: 'George',\n    company: 'Gamma Inc'\n  },\n  {\n    name: 'Henry',\n    company: 'Alpha Inc',\n    telephone: [\n      { work: '012301230123' },\n      { cell: '161803398875' }\n    ]\n  },\n]);\n\ndb.company.insertMany([\n  {\n    name: 'Alpha Inc',\n    base: 'US'\n  },\n  {\n    name: 'Beta Inc',\n    base: 'US'\n  },\n  {\n    name: 'Gamma Inc',\n    base: 'GB'\n  },\n]);<\/code><\/pre>\n<h3>De onde vem o _id?<\/h3>\n<p>MongoDB atribui automaticamente um _id a cada documento de uma cole\u00e7\u00e3o. Este \u00e9 um ObjectID &#8211; um valor BSON (Binary Javascript Object Notation) contendo:<\/p>\n<ul>\n<li>Per\u00edodo Unix epoch em segundos quando criado (4 bytes)<\/li>\n<li>ID de m\u00e1quina\/processo de 5 bytes<\/li>\n<li>Um contador de 3 bytes que come\u00e7a com um valor aleat\u00f3rio<\/li>\n<\/ul>\n<p>Esta \u00e9 a chave prim\u00e1ria do documento. O valor hexadecimal de 24 caracteres \u00e9 garantido como \u00fanico em todos os documentos do banco de dados, e n\u00e3o pode ser alterado uma vez inserido.<\/p>\n<p>MongoDB tamb\u00e9m fornece uma <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/ObjectId.getTimestamp\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o getTimeStamp()<\/a> para que voc\u00ea possa obter a data\/hora de cria\u00e7\u00e3o do documento sem ter que definir um valor explicitamente. Alternativamente, voc\u00ea pode definir seu pr\u00f3prio valor exclusivo _id quando um documento \u00e9 criado.<\/p>\n<h3>Desnormaliza\u00e7\u00e3o de dados<\/h3>\n<p>Os registros inseridos acima definem a empresa de cada usu\u00e1rio para uma cadeia como a \u201cAlpha Inc\u201d. Isso n\u00e3o \u00e9 recomendado em bancos de dados SQL normalizados:<\/p>\n<ul>\n<li>\u00c9 f\u00e1cil cometer um erro: um usu\u00e1rio \u00e9 designado para \u201cAlpha Inc\u201d enquanto outro \u00e9 \u201cAlpha Inc.\u201d (car\u00e1ter de per\u00edodo adicional). Eles s\u00e3o tratados como empresas diferentes.<\/li>\n<li>Atualizar o nome de uma empresa pode significar a atualiza\u00e7\u00e3o de muitos registros.<\/li>\n<\/ul>\n<p>A solu\u00e7\u00e3o SQL \u00e9 criar uma tabela <em>da empresa<\/em> e associar uma empresa a uma pessoa usando sua chave prim\u00e1ria (provavelmente um n\u00famero inteiro). A chave permaneceria a mesma independentemente da altera\u00e7\u00e3o do nome da empresa e o banco de dados pode aplicar regras para garantir a integridade dos dados.<\/p>\n<p>A desnormaliza\u00e7\u00e3o \u00e9 recomendada para MongoDB. Voc\u00ea deve repetir ativamente os dados e um \u00fanico documento pode conter todas as informa\u00e7\u00f5es que ele requer. Isso tem v\u00e1rias vantagens:<\/p>\n<ul>\n<li>Os documentos s\u00e3o autocontidos e mais f\u00e1ceis de ler \u2014 n\u00e3o h\u00e1 necessidade de fazer refer\u00eancia a outras cole\u00e7\u00f5es.<\/li>\n<li>O desempenho de escrita pode ser mais r\u00e1pido do que um banco de dados SQL porque menos regras de integridade de dados s\u00e3o aplicadas.<\/li>\n<li>O compartilhamento \u2014 ou a distribui\u00e7\u00e3o de dados entre v\u00e1rias m\u00e1quinas \u2014 torna-se mais f\u00e1cil porque n\u00e3o \u00e9 necess\u00e1rio fazer refer\u00eancia a dados em outras cole\u00e7\u00f5es.<\/li>\n<\/ul>\n<h2>Consultas simples no MongoDB<\/h2>\n<p>Voc\u00ea pode listar todos os documentos de uma cole\u00e7\u00e3o, como uma pessoa, usando uma consulta find():<\/p>\n<pre><code class=\"language-bash\">db.person.find({})<\/code><\/pre>\n<p>O <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/command\/count\/\" target=\"_blank\" rel=\"noopener noreferrer\">count() method<\/a> retorna o n\u00famero de documentos (em nosso caso, esse n\u00famero ser\u00e1 7):<\/p>\n<pre><code class=\"language-bash\">db.person.find({}).count();<\/code><\/pre>\n<p>Um <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/update\/sort\/\">m\u00e9todo sort()<\/a> retorna os documentos em qualquer ordem que voc\u00ea preferir, como, por exemplo, por nome em ordem alfab\u00e9tica inversa:<\/p>\n<pre><code class=\"language-bash\">db.person.find({}).sort({ name: -1 });<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode limitar o n\u00famero de documentos retornados, por exemplo, encontrar os tr\u00eas primeiros nomes:<\/p>\n<pre><code class=\"language-bash\">db.person.find({}).sort({ name: 1 }).limit(2);<\/code><\/pre>\n<p>Voc\u00ea pode procurar por registros espec\u00edficos definindo uma consulta com um ou mais campos, por exemplo, localizar todos os documentos pessoais onde o nome est\u00e1 definido como \u201cClaire\u201d:<\/p>\n<pre><code class=\"language-bash\">db.person.find({ name: 'Claire' });<\/code><\/pre>\n<p><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/\">Operadores l\u00f3gicos<\/a> como $and, $or, $not, $gt (maior que), $lt (menor que), e $ne (n\u00e3o igual), tamb\u00e9m s\u00e3o suportados, por exemplo, localizar todos os documentos pessoais onde a empresa \u00e9 \u201cAlpha Inc\u201d ou \u201cBeta Inc\u201d:<\/p>\n<pre><code class=\"language-bash\">db.person.find({\n  $or: [\n    { company: 'Alpha Inc' },\n    { company: 'Beta Inc' }\n  ]\n});<\/code><\/pre>\n<p>No banco de dados do exemplo, o mesmo resultado poderia ser alcan\u00e7ado com $nin (n\u00e3o em) para extrair todos os documentos onde a empresa <strong>n\u00e3o<\/strong> \u00e9 \u201cGamma Inc\u201d:<\/p>\n<pre><code class=\"language-bash\">db.person.find({\n  company: { $nin: ['Gamma Inc'] }\n});<\/code><\/pre>\n<p>Ao utilizar o m\u00e9todo find() no MongoDB, \u00e9 poss\u00edvel definir uma proje\u00e7\u00e3o atrav\u00e9s de um segundo objeto de valor, que especifica quais campos devem ser retornados. No exemplo dado, apenas o campo &#8220;name&#8221; \u00e9 retornado (lembrando que o campo &#8220;_id&#8221; \u00e9 sempre retornado a menos que seja explicitamente desativado):<\/p>\n<pre><code class=\"language-bash\">db.person.find(\n  { name:'Claire' },\n  { _id:0, name:1 }\n);<\/code><\/pre>\n<p>O resultado:<\/p>\n<pre><code class=\"language-bash\">{\n  \"name\" : \"Claire\"\n}<\/code><\/pre>\n<p>A <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/elemMatch\/\" target=\"_blank\" rel=\"noopener noreferrer\">consulta $elemMatch<\/a> permite que voc\u00ea encontre itens em uma array, como todos os documentos onde a array telef\u00f4nica tem um item de trabalho. O mesmo $elemMatch pode ser usado na proje\u00e7\u00e3o para mostrar apenas o n\u00famero do trabalho:<\/p>\n<pre><code class=\"language-bash\">db.person.find(\n  {\n    telephone: { $elemMatch: { work: { $exists: true }} }\n  },\n  {\n    _id: 0,\n    name:1,\n    telephone: { $elemMatch: { work: { $exists: true }}}\n  }\n);<\/code><\/pre>\n<p>O resultado:<\/p>\n<pre><code class=\"language-bash\">{\n  \"name\" : \"Abdul\",\n  \"telephone\" : [\n    { \"work\" : \"9876543210\" }\n  ]\n},\n{\n  \"name\" : \"Henry\",\n  \"telephone\" : [\n    { \"work\" : \"012301230123\" }\n  ]\n}<\/code><\/pre>\n<h2>Usando cursores no MongoDB<\/h2>\n<p>A maioria dos drivers de banco de dados permite que os resultados de uma consulta sejam retornados como uma array ou estrutura de dados similar. Entretanto, se esse conjunto contiver milhares de documentos, isso pode levar a problemas de mem\u00f3ria.<\/p>\n<p>Como a maioria dos bancos de dados SQL, o MongoDB suporta o conceito de <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/js-cursor\/\" target=\"_blank\" rel=\"noopener noreferrer\">cursores<\/a>. Os cursores permitem que um aplicativo leia os resultados da consulta um de cada vez antes de prosseguir para o pr\u00f3ximo item ou abandonar a busca.<\/p>\n<p>Cursores tamb\u00e9m podem ser usados a partir de uma shell MongoDB:<\/p>\n<pre><code class=\"language-bash\">let myCursor = db.person.find( {} );\n\nwhile ( myCursor.hasNext() ) {\n  print(tojson( myCursor.next() ));\n}<\/code><\/pre>\n<h2>Como criar \u00edndices no MongoDB<\/h2>\n<p>A \u201cperson collection\u201d atualmente possui sete documentos, portanto qualquer consulta n\u00e3o ser\u00e1 computacionalmente cara. Entretanto, imagine que voc\u00ea tenha um milh\u00e3o de contatos com um nome e um endere\u00e7o de e-mail. Os contatos podem ser ordenados por nome, mas os endere\u00e7os de e-mail estar\u00e3o em uma ordem aparentemente aleat\u00f3ria.<\/p>\n<p>Se voc\u00ea precisar procurar um contato pelo e-mail dele, o banco de dados teria que procurar at\u00e9 um milh\u00e3o de itens antes de encontrar uma correspond\u00eancia. Adicionar um \u00edndice no campo de e-mail cria uma \u201ctabela&#8221; de pesquisa onde os e-mails s\u00e3o armazenados em ordem alfab\u00e9tica. O banco de dados agora pode usar algoritmos de busca mais eficientes para localizar a pessoa correta.<\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Os \u00edndices se tornam essenciais \u00e0 medida que o n\u00famero de documentos aumenta. Em geral, voc\u00ea deve aplicar um \u00edndice a qualquer campo que possa ser referenciado em uma consulta. Voc\u00ea pode aplicar \u00edndices a todos os campos, mas esteja ciente de que isso tornaria as atualiza\u00e7\u00f5es de dados mais lentas e aumentaria o espa\u00e7o em disco necess\u00e1rio, pois a reindexa\u00e7\u00e3o se torna necess\u00e1ria.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>O MongoDB oferece uma variedade de tipos de \u00edndices.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>\u00cdndices de campo \u00fanico<\/h3>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>A maioria dos \u00edndices no MongoDB s\u00e3o aplicados a campos individuais, por exemplo, indexar o campo &#8220;name&#8221; em ordem alfab\u00e9tica ascendente:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.person.createIndex({ name: 1 });<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Usar -1 inverte a ordem. Isso teria pouco benef\u00edcio em nosso exemplo aqui, mas pode ser \u00fatil se voc\u00ea tiver um campo de data em que eventos mais recentes tenham prioridade.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Tr\u00eas outros \u00edndices s\u00e3o \u00fateis no exemplo do banco de dados mongodemo:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.person.createIndex( { company: 1 } );\ndb.company.createIndex( { name: 1 } );\ndb.company.createIndex( { base: 1 } );<\/code><\/pre>\n<h3>\u00cdndices compostos em m\u00faltiplos campos<\/h3>\n<p>Dois ou mais campos podem ser especificados em um \u00edndice, por exemplo:<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex( { name: 1, company: 1 } );<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Isso pode ser \u00fatil quando um campo \u00e9 regularmente usado em conjunto com outro em consultas de pesquisa.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>\u00cdndices multikey em array ou elementos de objetos<\/h3>\n<p>Os documentos podem ser complexos e muitas vezes \u00e9 necess\u00e1rio indexar campos mais detalhados na estrutura, como o n\u00famero de telefone do trabalho:<\/p>\n<pre><code class=\"language-bash\">db.products.createIndex( { 'telephone.work': 1 } );<\/code><\/pre>\n<h3>\u00cdndices de wildcard<\/h3>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Um caractere wildcard pode indexar todos os campos em um documento. Isso \u00e9 geralmente pr\u00e1tico em documentos menores e mais simples que podem ser consultados de v\u00e1rias maneiras:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.company.createIndex( { '$**': 1 } );<\/code><\/pre>\n<h3>\u00cdndices de texto completo<\/h3>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Um \u00edndice de texto completo (Fulltext Index) permite criar consultas semelhantes \u00e0s de um mecanismo de pesquisa, que podem examinar o texto em todos os campos de string e ordenar por relev\u00e2ncia. \u00c9 poss\u00edvel limitar o \u00edndice de texto completo a campos espec\u00edficos:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.person.createIndex( { name: \"text\", company: \"text\" } );<\/code><\/pre>\n<p>&#8230; ou criar um \u00edndice de texto em todos os campos de string:<\/p>\n<pre><code class=\"language-bash\">db.person.createIndex( { \"$**\": \"text\" } );<\/code><\/pre>\n<p>O <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/text-search\/\" target=\"_blank\" rel=\"noopener noreferrer\"> operador $text<\/a> permite que voc\u00ea pesquise este \u00edndice, tal como encontrar todos os documentos onde \u201cGama\u201d \u00e9 referenciado:<\/p>\n<pre><code class=\"language-bash\">db.person.find({ $text: { $search: 'Gamma' } });<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Observe que as pesquisas de texto completo geralmente exigem cinco ou mais caracteres para retornar resultados \u00fateis.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h3>Outros tipos de \u00edndice<\/h3>\n<p>A MongoDB fornece v\u00e1rios outros tipos de \u00edndices especializados:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/core\/index-hashed\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00edndice hashed<\/a><\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/core\/2dsphere\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00edndice 2d<\/a> \u2014 pontos em um plano bidimensional<\/li>\n<li><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/core\/2d\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00cdndice 2dsphere<\/a> \u2014 geometrias em uma esfera semelhante \u00e0 Terra<\/li>\n<\/ul>\n<h2>Como gerenciar os \u00edndices MongoDB<\/h2>\n<p>Os \u00edndices definidos em uma cole\u00e7\u00e3o podem ser examinados com:<\/p>\n<pre><code class=\"language-bash\">db.person.getIndexes();<\/code><\/pre>\n<p>Isso retorna uma s\u00e9rie de resultados, como, por exemplo:<\/p>\n<pre><code class=\"language-bash\">[\n  {\n    \"v\" : 2.0,\n    \"key\" : { \"_id\" : 1.0 },\n    \"name\" : \"_id_\"\n  },\n  {\n    \"v\" : 2.0,\n    \"key\" : { \"company\" : 1.0 },\n    \"name\" : \"company_1\"\n  },\n  {\n    \"v\" : 2.0,\n    \"key\" : { \"name\" : 1.0 },\n    \"name\" : \"name_1\"\n  }\n]<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>A \u201ckey\u201d define o campo e a ordem, enquanto o \u201cname\u201d \u00e9 um identificador \u00fanico para esse \u00edndice \u2014 como \u201ccompany_1\u201d para o \u00edndice no campo da empresa.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>A efic\u00e1cia de um \u00edndice pode ser examinada adicionando um <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.collection.explain\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9todo .explain()<\/a> a qualquer consulta, por exemplo.<\/p>\n<pre><code class=\"language-bash\">db.person.find({ name:'Claire' }).explain();<\/code><\/pre>\n<p>Isso retorna um grande conjunto de dados, mas o objeto \u201cwinningPlan\u201d mostra o \u201cindexName\u201d usado na consulta:<\/p>\n<pre><code class=\"language-bash\">\"winningPlan\" : {\n  \"stage\" : \"FETCH\",\n  \"inputStage\" : {\n    \"stage\" : \"IXSCAN\",\n    \"keyPattern\" : { \"name\" : 1.0 },\n    \"indexName\" : \"name_1\",\n  }\n}<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Se necess\u00e1rio, voc\u00ea pode excluir um \u00edndice referenciando seu nome:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.person.dropIndex( 'name_1' );<\/code><\/pre>\n<p>ou usando o documento de especifica\u00e7\u00e3o do \u00edndice:<\/p>\n<pre><code class=\"language-bash\">db.person.dropIndex({ name: 1 });<\/code><\/pre>\n<p>O <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.collection.dropIndexes\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9todo dropIndexes()<\/a> permite que voc\u00ea exclua mais de um \u00edndice em um \u00fanico comando.<\/p>\n<h2>Usando schemas de valida\u00e7\u00e3o de dados MongoDB<\/h2>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Ao contr\u00e1rio do SQL, schemas de defini\u00e7\u00e3o de dados n\u00e3o s\u00e3o necess\u00e1rios no MongoDB. \u00c9 poss\u00edvel inserir qualquer dado em qualquer documento em qualquer cole\u00e7\u00e3o a qualquer momento.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Isso proporciona uma grande liberdade. No entanto, pode haver momentos em que voc\u00ea queira exigir que as regras sejam seguidas. Por exemplo, n\u00e3o deve ser poss\u00edvel inserir um documento na \u201cperson <span id=\"urn:enhancement-e1add410-080f-4bf5-9915-ce3779caf299\" class=\"textannotation\">collection\u201d<\/span> a menos que ele contenha um nome.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Regras de valida\u00e7\u00e3o podem ser especificadas usando um <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/query\/jsonSchema\/\" target=\"_blank\" rel=\"noopener noreferrer\">objeto $jsonSchema<\/a> que define uma array de itens obrigat\u00f3rios e as propriedades de cada campo validado. A \u201cperson <span id=\"urn:enhancement-e1add410-080f-4bf5-9915-ce3779caf299\" class=\"textannotation\">collection\u201d<\/span> j\u00e1 foi criada, mas ainda \u00e9 poss\u00edvel definir um schema que especifica que uma string de nome \u00e9 obrigat\u00f3ria:<\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.runCommand({\n  collMod: 'person',\n  validator: {\n    $jsonSchema: {\n      required: [ 'name' ],\n      properties: {\n        name: {\n          bsonType: 'string',\n          description: 'name string required'\n        }\n      }\n    }\n  }\n});<\/code><\/pre>\n<p>Tente inserir um documento pessoal sem um nome:<\/p>\n<pre><code class=\"language-bash\">db.person.insertOne({ company: 'Alpha Inc' });<\/code><\/pre>\n<p>&#8230; e o comando falhar\u00e1:<\/p>\n<pre><code class=\"language-bash\">{\n  \"index\" : 0.0,\n  \"code\" : 121.0,\n  \"errmsg\" : \"Document failed validation\",\n  \"op\" : {\n      \"_id\" : ObjectId(\"624591771658cd08f8290401\"),\n      \"company\" : \"Alpha Inc\"\n  }\n}<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Schemas tamb\u00e9m podem ser definidos se voc\u00ea <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/db.createCollection\/\" target=\"_blank\" rel=\"noopener noreferrer\">criar uma cole\u00e7\u00e3o<\/a> antes que ela seja utilizada. O comando a seguir implementa as mesmas regras mencionadas acima:<\/p>\n<pre><code class=\"language-bash\">db.createCollection('person', {\n  validator: {\n    $jsonSchema: {\n        required: [ 'name' ],\n        properties: {\n          name: {\n          bsonType: 'string',\n          description: 'name string required'\n          }\n      }\n    }\n  }\n});<\/code><\/pre>\n<p>Este exemplo mais complexo cria uma cole\u00e7\u00e3o de usu\u00e1rios que valida que um nome, endere\u00e7o de e-mail e pelo menos um n\u00famero de telefone devem ser fornecidos:<\/p>\n<pre><code class=\"language-bash\">db.createCollection('users', {\n  validator: {\n    $jsonSchema: {\n      required: [ 'name', 'email', 'telephone' ],\n      properties: {\n        name: {\n          bsonType: 'string',\n          description: 'name string required'\n          },\n          email: {\n        bsonType: 'string',\n          pattern: '^.+@.+$',\n          description: 'valid email required'\n          },\n        telephone: {\n          bsonType: 'array',\n          minItems: 1,\n          description: 'at least one telephone number required'\n          }\n      }\n    }\n  }\n});<\/code><\/pre>\n<h2>Como atualizar documentos existentes no MongoDB<\/h2>\n<p>MongoDB oferece v\u00e1rios <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/update-methods\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9todos de atualiza\u00e7\u00e3o<\/a>, incluindo <code>updateOne()<\/code>, <code>updateMany()<\/code>, e <code>replaceOne()<\/code>. Eles s\u00e3o passados como par\u00e2metros:<\/p>\n<ul>\n<li>Um objeto de filtro que localiza documentos a serem atualizados.<\/li>\n<li>Um objeto de atualiza\u00e7\u00e3o \u2014 ou um array de objetos de atualiza\u00e7\u00e3o \u2014 descrevendo os dados a serem alterados.<\/li>\n<li>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Um objeto de op\u00e7\u00f5es opcional. A propriedade mais \u00fatil \u00e9 a upsert, que pode inserir um novo documento se nenhum for encontrado.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/li>\n<\/ul>\n<p>O exemplo a seguir atualiza o documento da pessoa onde o nome est\u00e1 definido como \u201cHenry\u201d. Ele remove o n\u00famero de telefone do trabalho, adiciona um n\u00famero de telefone residencial e estabelece uma nova data de nascimento:<\/p>\n<pre><code class=\"language-bash\">db.person.updateOne(\n  { name: 'Henry' },\n  [\n    { $unset: [ 'telephone.work' ] },\n    { $set: {\n      'birthdate': new ISODate('1980-01-01'),\n      'telephone': [ { 'home': '789789789' } ]\n    } }\n  ]\n);<\/code><\/pre>\n<p>Este pr\u00f3ximo exemplo atualiza o documento da pessoa onde o nome est\u00e1 definido como \u201cIan\u201d. Esse nome n\u00e3o existe atualmente, mas a configura\u00e7\u00e3o para \u201ctrue\u201d o cria:<\/p>\n<pre><code class=\"language-bash\">db.person.updateOne(\n  { name: 'Ian' },\n  { $set: { company: 'Beta Inc' } },\n  { upsert: true }\n);<\/code><\/pre>\n<p>Voc\u00ea pode executar comandos de consulta para examinar as atualiza\u00e7\u00f5es de dados a qualquer momento.<\/p>\n<h2>Como excluir documentos no MongoDB<\/h2>\n<p>O exemplo de atualiza\u00e7\u00e3o acima usou $unset para remover o n\u00famero de telefone do trabalho do documento com o nome \u201cHenry\u201d. Para remover um documento inteiro, voc\u00ea pode usar um dos v\u00e1rios <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/delete-methods\/\" target=\"_blank\" rel=\"noopener noreferrer\">m\u00e9todos de exclus\u00e3o,<\/a> incluindo <code>deleteOne()<\/code>, <code>deleteMany()<\/code>, e <code>remove()<\/code> (que pode excluir um ou v\u00e1rios).<\/p>\n<p>O documento rec\u00e9m-criado para Ian pode ser exclu\u00eddo com um filtro apropriado:<\/p>\n<pre><code class=\"language-bash\">db.person.deleteOne({ name: 'Ian' });<\/code><\/pre>\n<h2>Usando opera\u00e7\u00f5es de agrega\u00e7\u00e3o no MongoDB<\/h2>\n<p><a href=\"https:\/\/www.mongodb.com\/docs\/manual\/aggregation\/\" target=\"_blank\" rel=\"noopener noreferrer\">A agrega\u00e7\u00e3o<\/a> \u00e9 poderosa, mas pode ser dif\u00edcil de compreender. Ela define uma s\u00e9rie \u2014 ou <em>pipeline<\/em> \u2014 de opera\u00e7\u00f5es em uma array. Cada etapa desse pipeline <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/meta\/aggregation-quick-reference\/\" target=\"_blank\" rel=\"noopener noreferrer\">realiza uma opera\u00e7\u00e3o<\/a> como filtrar, agrupar, calcular ou modificar um conjunto de documentos. Um est\u00e1gio tamb\u00e9m pode usar um comportamento do tipo SQL JOIN com uma <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/lookup\/\" target=\"_blank\" rel=\"noopener noreferrer\">opera\u00e7\u00e3o de $lookup<\/a>. Os documentos resultantes s\u00e3o passados para o pr\u00f3ximo est\u00e1gio do pipeline para processamento adicional, se necess\u00e1rio.<\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>A agrega\u00e7\u00e3o \u00e9 melhor ilustrada com um exemplo pr\u00e1tico. Criaremos uma consulta passo a passo que retorna o nome, a empresa e o n\u00famero de telefone do trabalho (se dispon\u00edvel) de qualquer pessoa que trabalhe para uma organiza\u00e7\u00e3o com sede nos Estados Unidos.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>A primeira opera\u00e7\u00e3o tem um valor de $match para filtrar empresas sediadas nos EUA:<\/p>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } }\n]);<\/code><\/pre>\n<p>Isso retorna:<\/p>\n<pre><code class=\"language-bash\">{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853b\"),\n  \"name\" : \"Alpha Inc\",\n  \"base\" : \"US\"\n}\n{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853c\"),\n  \"name\" : \"Beta Inc\",\n  \"base\" : \"US\"\n}<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>Em seguida, podemos adicionar um novo operador de pipeline $lookup, que corresponde ao nome da empresa (localField) \u00e0 empresa (foreignField) na \u201cperson <span id=\"urn:enhancement-e1add410-080f-4bf5-9915-ce3779caf299\" class=\"textannotation\">collection\u201d<\/span> (from). A sa\u00edda ser\u00e1 anexada como uma array de funcion\u00e1rios a cada documento de empresa:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } },\n  { $lookup: {\n      from: 'person',\n      localField: 'name',\n      foreignField: 'company',\n            as: 'employee'\n          }\n        }\n]);<\/code><\/pre>\n<p>E aqui est\u00e1 o resultado:<\/p>\n<pre><code class=\"language-bash\">{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853b\"),\n  \"name\" : \"Alpha Inc\",\n  \"base\" : \"US\",\n  \"employee\" : [\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8534\"),\n      \"name\" : \"Abdul\",\n      \"company\" : \"Alpha Inc\",\n      \"telephone\" : [\n        { \"home\" : \"0123456789\" },\n        { \"work\" : \"9876543210\" }\n      ]\n    },\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8537\"),\n      \"name\" : \"Dawn\",\n      \"company\" : \"Alpha Inc\"\n    },\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b853a\"),\n      \"name\" : \"Henry\",\n      \"company\" : \"Alpha Inc\",\n      \"telephone\" : [\n        { \"home\" : \"789789789\" }\n      ],\n    }\n  ]\n}\n{\n  \"_id\" : ObjectId(\"62442429854636a03f6b853c\"),\n  \"name\" : \"Beta Inc\",\n  \"base\" : \"US\",\n  \"employee\" : [\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8535\"),\n      \"name\" : \"Brian\",\n      \"company\" : \"Beta Inc\"\n    },\n    {\n      \"_id\" : ObjectId(\"62442429854636a03f6b8538\"),\n      \"name\" : \"Esther\",\n      \"company\" : \"Beta Inc\",\n      \"telephone\" : [\n       { \"home\" : \"001122334455\" }\n      ]\n    }\n  ]\n}<\/code><\/pre>\n<p>Uma <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/project\/#mongodb-pipeline-pipe.-project\" target=\"_blank\" rel=\"noopener noreferrer\"> opera\u00e7\u00e3o de $project (proje\u00e7\u00e3o)<\/a> agora pode remover tudo, exceto as arrays de funcion\u00e1rios. Isso \u00e9 seguido por uma <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/unwind\/#mongodb-pipeline-pipe.-unwind\" target=\"_blank\" rel=\"noopener noreferrer\"> opera\u00e7\u00e3o de $unwind<\/a> para destruir a array e obter documentos separados dos funcion\u00e1rios:<\/p>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex justify-between lg:block\">\n<div class=\"text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-2 md:gap-3 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } },\n  { $lookup: { from: 'person', localField: 'name', foreignField: 'company', as: 'employee' } },\n  { $project: { _id: 0, employee: 1 } },\n  { $unwind: '$employee' }\n]);<\/code><\/pre>\n<p>O resultado:<\/p>\n<pre><code class=\"language-bash\">{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8534\"),\n    \"name\" : \"Abdul\",\n    \"company\" : \"Alpha Inc\",\n    \"telephone\" : [\n      { \"home\" : \"0123456789\" },\n      { \"work\" : \"9876543210\" }\n    ]\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8537\"),\n    \"name\" : \"Dawn\",\n    \"company\" : \"Alpha Inc\"\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b853a\"),\n    \"name\" : \"Henry\",\n    \"company\" : \"Alpha Inc\",\n    \"telephone\" : [\n      { \"home\" : \"789789789\" }\n    ]\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8535\"),\n    \"name\" : \"Brian\",\n    \"company\" : \"Beta Inc\"\n  }\n}\n{\n  \"employee\" : {\n    \"_id\" : ObjectId(\"62442429854636a03f6b8538\"),\n    \"name\" : \"Esther\",\n    \"company\" : \"Beta Inc\",\n    \"telephone\" : [\n      { \"home\" : \"001122334455\" }\n    ]\n  }\n}<\/code><\/pre>\n<p>Por fim, uma<a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/replaceRoot\/#mongodb-pipeline-pipe.-replaceRoot\" target=\"_blank\" rel=\"noopener noreferrer\"> opera\u00e7\u00e3o de $replaceRoot<\/a> \u00e9 usada para formatar cada documento para retornar apenas o nome da pessoa, empresa e n\u00famero de telefone do trabalho. Isso \u00e9 seguido por uma ordem de <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/operator\/aggregation\/sort\/#mongodb-pipeline-pipe.-sort\" target=\"_blank\" rel=\"noopener noreferrer\">$sort<\/a> para emitir documentos em ordem de ascendente de nome. A consulta agregada completa fica:<\/p>\n<pre><code class=\"language-bash\">db.company.aggregate([\n  { $match: { base: 'US' } },\n  { $lookup: { from: 'person', localField: 'name', foreignField: 'company', as: 'employee' } },\n  { $project: { _id: 0, employee: 1 } },\n  { $unwind: '$employee' },\n  { $replaceRoot: {\n    newRoot: {\n      $mergeObjects: [ {\n        name: \"$employee.name\",\n        company: '$employee.company',\n        work: { $first: '$employee.telephone.work' }\n      }, \"$name\" ]\n   } } },\n  { $sort: { name: 1 } }\n]);<\/code><\/pre>\n<p>O resultado:<\/p>\n<pre><code class=\"language-bash\">{\n  \"name\" : \"Abdul\",\n  \"company\" : \"Alpha Inc\",\n  \"work\" : \"9876543210\"\n}\n{\n  \"name\" : \"Brian\",\n  \"company\" : \"Beta Inc\",\n}\n{\n  \"name\" : \"Dawn\",\n  \"company\" : \"Alpha Inc\",\n}\n{\n  \"name\" : \"Esther\",\n  \"company\" : \"Beta Inc\"\n}\n{\n  \"name\" : \"Henry\",\n  \"company\" : \"Alpha Inc\"\n}<\/code><\/pre>\n<p>Existem outras maneiras de obter esse resultado, mas o ponto principal \u00e9 que o MongoDB pode fazer a maior parte do trabalho. Raramente \u00e9 necess\u00e1rio ler documentos e manipular os dados em seu c\u00f3digo de aplicativo diretamente.<\/p>\n<h2>Como executar opera\u00e7\u00f5es em massa do MongoDB<\/h2>\n<p><span style=\"font-size: 1rem\">Por padr\u00e3o, o MongoDB pode lidar com 1.000 opera\u00e7\u00f5es simult\u00e2neas. Isso provavelmente n\u00e3o ser\u00e1 um problema ao usar o mongosh, mas os aplicativos podem atingir esse limite se fizerem uma s\u00e9rie de manipula\u00e7\u00f5es de dados em registros individuais. Aplicativos Node.js s\u00e3o especialmente problem\u00e1ticas porque podem emitir rapidamente uma s\u00e9rie de solicita\u00e7\u00f5es ass\u00edncronas sem precisar esperar at\u00e9 que elas sejam conclu\u00eddas.<\/span><\/p>\n<p>Para contornar este problema, MongoDB fornece uma <a href=\"https:\/\/www.mongodb.com\/docs\/manual\/reference\/method\/js-bulk\/\" target=\"_blank\" rel=\"noopener noreferrer\">API de opera\u00e7\u00f5es em massa<\/a> que aceita qualquer n\u00famero de atualiza\u00e7\u00f5es que podem ser executadas em ordem ou em qualquer ordem.<\/p>\n<p>Aqui est\u00e1 um exemplo de pseudoc\u00f3digo no Node.js:<\/p>\n<pre><code class=\"language-bash\">\/\/ reference the mycollection collection\nconst bulk = db.collection('mycollection').initializeUnorderedBulkOp();\n\n\/\/ make any number of data changes\nbulk.insertOne(...);\nbulk.insertMany(...)\nbulk.updateOne(...);\nbulk.deleteOne(...);\n\/\/ etc...\n\nbulk.execute();<\/code><\/pre>\n<div class=\"group w-full text-gray-800 dark:text-gray-100 border-b border-black\/10 dark:border-gray-900\/50 bg-gray-50 dark:bg-[#444654]\">\n<div class=\"text-base gap-4 md:gap-6 md:max-w-2xl lg:max-w-xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0 m-auto\">\n<div class=\"relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]\">\n<div class=\"flex flex-grow flex-col gap-3\">\n<div class=\"min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap\">\n<div class=\"markdown prose w-full break-words dark:prose-invert light\">\n<p>O \u00faltimo comando efetivamente emite uma \u00fanica solicita\u00e7\u00e3o MongoDB, ent\u00e3o voc\u00ea tem menos chance de atingir o limite de 1.000 opera\u00e7\u00f5es.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n<h2>Resumo<\/h2>\n<p><span style=\"font-size: 1rem\">O MongoDB oferece um armazenamento flex\u00edvel para aplicativos, como sistemas de gerenciamento de conte\u00fado, agendas de endere\u00e7os e redes sociais, onde estruturas de dados r\u00edgidas s\u00e3o muito restritivas e dif\u00edceis de definir. <\/span><span style=\"font-size: 1rem\">As escritas de dados s\u00e3o r\u00e1pidas e a fragmenta\u00e7\u00e3o entre m\u00faltiplos servidores se torna mais f\u00e1cil.<\/span><\/p>\n<p>Escrever aplicativos usando um banco de dados MongoDB tamb\u00e9m pode ser libertador. \u00c9 poss\u00edvel armazenar quaisquer dados em qualquer documento em qualquer cole\u00e7\u00e3o, a qualquer momento. Isso \u00e9 especialmente pr\u00e1tico quando voc\u00ea est\u00e1 desenvolvendo um prot\u00f3tipo ou produto m\u00ednimo vi\u00e1vel usando metodologias \u00e1geis onde os requisitos evoluem com o tempo.<\/p>\n<p>Dito isso, consultas complexas podem ser um desafio e os conceitos de desnormaliza\u00e7\u00e3o s\u00e3o dif\u00edceis de aceitar quando voc\u00ea est\u00e1 migrando do mundo SQL.<\/p>\n<p>O MongoDB \u00e9 menos adequado para aplicativos com requisitos transacionais rigorosos onde a integridade dos dados \u00e9 essencial, como bancos, contabilidade e sistemas de controle de estoque. Esses sistemas t\u00eam campos de dados identific\u00e1veis que devem ser projetados antes do in\u00edcio da codifica\u00e7\u00e3o.<\/p>\n<p>Existem muitos tipos de aplicativos entre esses dois extremos, o que dificulta escolher um banco de dados apropriado. Felizmente, bancos de dados NoSQL, incluindo o MongoDB, come\u00e7aram a adotar op\u00e7\u00f5es semelhantes ao SQL, incluindo JOINs e transa\u00e7\u00f5es.<\/p>\n<p>Por outro lado, bancos de dados SQL como MySQL e <a href=\"https:\/\/kinqsta.com\/pt\/blog\/operadores-mongodb\/\">PostgreSQL<\/a> agora oferecem campos de dados JSON do tipo NoSQL. Eles tamb\u00e9m podem merecer sua aten\u00e7\u00e3o, mas como sempre, a escolha final \u00e9 sua.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este tutorial apresenta o banco de dados MongoDB. Voc\u00ea aprender\u00e1 como instalar o software, manipular dados e aplicar t\u00e9cnicas de design de dados em seus pr\u00f3prios &#8230;<\/p>\n","protected":false},"author":188,"featured_media":50771,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[219,444,439,909,910],"topic":[948,1018],"class_list":["post-50770","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-database","tag-database-management-tool","tag-development","tag-mangodb","tag-nosql","topic-adminer","topic-ferramentas-desenvolvimento-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto<\/title>\n<meta name=\"description\" content=\"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto\" \/>\n<meta property=\"og:description\" content=\"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-27T07:05:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-01T20:04:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Craig Buckler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@craigbuckler\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Craig Buckler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\"},\"author\":{\"name\":\"Craig Buckler\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e\"},\"headline\":\"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto\",\"datePublished\":\"2022-06-27T07:05:06+00:00\",\"dateModified\":\"2025-10-01T20:04:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\"},\"wordCount\":4430,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg\",\"keywords\":[\"database\",\"database management tool\",\"development\",\"MangoDB\",\"NoSQL\"],\"inLanguage\":\"pt-PT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\",\"url\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\",\"name\":\"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg\",\"datePublished\":\"2022-06-27T07:05:06+00:00\",\"dateModified\":\"2025-10-01T20:04:13+00:00\",\"description\":\"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ferramentas de Desenvolvimento Web\",\"item\":\"https:\/\/kinqsta.com\/pt\/topicos\/ferramentas-desenvolvimento-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#website\",\"url\":\"https:\/\/kinqsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e\",\"name\":\"Craig Buckler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g\",\"caption\":\"Craig Buckler\"},\"description\":\"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.\",\"sameAs\":[\"https:\/\/craigbuckler.com\/\",\"https:\/\/www.linkedin.com\/in\/craigbuckler\",\"https:\/\/x.com\/craigbuckler\",\"https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ\"],\"url\":\"https:\/\/kinqsta.com\/pt\/blog\/author\/craigbuckler\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto","description":"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/","og_locale":"pt_PT","og_type":"article","og_title":"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto","og_description":"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.","og_url":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-06-27T07:05:06+00:00","article_modified_time":"2025-10-01T20:04:13+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg","type":"image\/jpeg"}],"author":"Craig Buckler","twitter_card":"summary_large_image","twitter_description":"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.","twitter_image":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg","twitter_creator":"@craigbuckler","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Craig Buckler","Tempo estimado de leitura":"23 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/"},"author":{"name":"Craig Buckler","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e"},"headline":"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto","datePublished":"2022-06-27T07:05:06+00:00","dateModified":"2025-10-01T20:04:13+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/"},"wordCount":4430,"publisher":{"@id":"https:\/\/kinqsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg","keywords":["database","database management tool","development","MangoDB","NoSQL"],"inLanguage":"pt-PT"},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/","url":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/","name":"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto","isPartOf":{"@id":"https:\/\/kinqsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg","datePublished":"2022-06-27T07:05:06+00:00","dateModified":"2025-10-01T20:04:13+00:00","description":"Como as solu\u00e7\u00f5es de banco de dados de c\u00f3digo aberto continuam crescendo em popularidade, reunimos um guia para ajud\u00e1-lo a explorar o MongoDB e decidir se ele \u00e9 adequado para o seu projeto.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#primaryimage","url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg","contentUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/06\/what-is-mongodb.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/pt\/blog\/o-que-e-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Ferramentas de Desenvolvimento Web","item":"https:\/\/kinqsta.com\/pt\/topicos\/ferramentas-desenvolvimento-web\/"},{"@type":"ListItem","position":3,"name":"O que \u00e9 MongoDB? Tudo Sobre o Popular Banco de Dados de C\u00f3digo Aberto"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/pt\/#website","url":"https:\/\/kinqsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinqsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/715d986404b06691ab3014e06596908e","name":"Craig Buckler","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinqsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8e76011e66720bd2e3e24e164aa6f0b2?s=96&d=mm&r=g","caption":"Craig Buckler"},"description":"Freelance UK web developer, writer, and speaker. Has been around a long time and rants about standards and performance.","sameAs":["https:\/\/craigbuckler.com\/","https:\/\/www.linkedin.com\/in\/craigbuckler","https:\/\/x.com\/craigbuckler","https:\/\/www.youtube.com\/channel\/UCQwdl5oBTWGhifS6bRGADMQ"],"url":"https:\/\/kinqsta.com\/pt\/blog\/author\/craigbuckler\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/50770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/comments?post=50770"}],"version-history":[{"count":9,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/50770\/revisions"}],"predecessor-version":[{"id":58804,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/posts\/50770\/revisions\/58804"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/translations\/es"},{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/50770\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/media\/50771"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/media?parent=50770"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/tags?post=50770"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/pt\/wp-json\/wp\/v2\/topic?post=50770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}