{"id":13178,"date":"2022-05-05T08:04:00","date_gmt":"2022-05-05T15:04:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13178"},"modified":"2025-06-13T20:56:45","modified_gmt":"2025-06-14T03:56:45","slug":"asp-net-core-crud-nosql-part-3","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-core-crud-nosql-part-3\/","title":{"rendered":"CRUD do ASP.NET Core com NoSQL: Parte 3"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Os aplicativos ASP.NET CRUD consistem em criar, ler, atualizar e excluir. Em <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-core-crud-with-nosql-part-1\/\"><span style=\"font-weight: 400;\">Parte 1<\/span><\/a><span style=\"font-weight: 400;\">Em seguida, configuramos um projeto b\u00e1sico do ASP.NET Core. Em <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-crud-nosql-part-2\/\"><span style=\"font-weight: 400;\">Parte 2<\/span><\/a><span style=\"font-weight: 400;\">adicionamos o primeiro <\/span><i><span style=\"font-weight: 400;\">ler<\/span><\/i><span style=\"font-weight: 400;\"> usando uma consulta SQL++ em rela\u00e7\u00e3o aos dados da lista de desejos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O SQL++ do Couchbase \u00e9 uma linguagem de consulta avan\u00e7ada, que cont\u00e9m todos os melhores recursos do SQL relacional, com um superconjunto de recursos para consulta de dados JSON.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">No entanto, o SQL++ n\u00e3o \u00e9 a \u00fanica maneira de interagir com os dados no Couchbase. Nesta postagem, exploraremos o uso da API de valor-chave.<\/span><\/p>\n<h2><b>Valor-chave versus SQL?<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Se voc\u00ea tem um hist\u00f3rico relacional, provavelmente est\u00e1 acostumado com o SQL sendo <\/span><i><span style=\"font-weight: 400;\">o \u00fanico<\/span><\/i><span style=\"font-weight: 400;\"> maneira de interagir com os dados (mesmo que voc\u00ea esteja usando uma ferramenta como o Entity Framework Core, ele ainda est\u00e1 usando SQL). Um dos excelentes recursos de um banco de dados NoSQL (como o Couchbase) \u00e9 que, embora o SQL esteja dispon\u00edvel, tamb\u00e9m h\u00e1 outros m\u00e9todos de acesso dispon\u00edveis. (Por isso, o <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Backronym\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">backr\u00f4nimo<\/span><\/a><span style=\"font-weight: 400;\"> \"Not Only SQL\").<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para o Couchbase, a maneira mais eficiente de acessar os dados \u00e9 por meio de <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/kv-operations.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">pesquisa de valor-chave<\/span><\/a><span style=\"font-weight: 400;\">. Todos os outros \u00edndices e consultas suportados pelo Couchbase (<\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-intro\/queriesandresults.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">SQL++<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/fts\/fts-introduction.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Pesquisa de texto completo<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/analytics\/introduction.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">An\u00e1lises<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-overview.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Eventos<\/span><\/a><span style=\"font-weight: 400;\">e outros) s\u00e3o, em \u00faltima an\u00e1lise, constru\u00eddos ou dependem da simples pesquisa de valores-chave.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A API de valor-chave lhe proporcionar\u00e1 o melhor desempenho, onde:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Uma chave \u00e9 especificada, ou<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Seu c\u00f3digo recebe uma chave, ou<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Voc\u00ea pode construir uma chave de forma determin\u00edstica<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><b>Exemplos: quando usar chave-valor<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Aqui est\u00e3o alguns exemplos de quando (e quando N\u00c3O) usar a API de valor-chave para leitura:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Caso de uso<\/strong><\/td>\n<td><strong>Chave-valor?<\/strong><\/td>\n<td><strong>Por que ou por que n\u00e3o?<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pesquisar um usu\u00e1rio com a chave \"<em>73892<\/em>&#8220;<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Sim<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Pesquisa direta<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pesquisar apenas o endere\u00e7o de e-mail de um usu\u00e1rio com a chave \"<em>73892<\/em>&#8220;<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Sim<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Mesmo que o documento do usu\u00e1rio seja grande, o Couchbase tem um recurso baseado em chave <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/reading-data.html#reading-a-sub-document\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">API de subdocumento<\/span><\/a><span style=\"font-weight: 400;\">que permite que voc\u00ea recupere uma parte do documento.<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pesquisar um grupo de usu\u00e1rios com as chaves \"<em>73892<\/em>&#8220;, &#8220;<em>47212<\/em>\", e <em>&#8220;90491&#8221;<\/em><\/span><\/td>\n<td><span style=\"font-weight: 400;\">Sim<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Isso pode exigir v\u00e1rias opera\u00e7\u00f5es de pesquisa de chave, mas ainda assim pode ser mais r\u00e1pido do que usar um <em>SQL <\/em><\/span><em><span style=\"font-weight: 400;\">SELECT ... WHERE ... IN<\/span><\/em><span style=\"font-weight: 400;\"> consulta.<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pesquisar os coment\u00e1rios de uma postagem de blog<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Talvez<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Se os coment\u00e1rios de um post de blog estiverem em um \u00fanico documento e a chave do post de blog for conhecida, uma chave de coment\u00e1rio de post de blog poder\u00e1 ser criada. Por exemplo, a chave do post do blog \u00e9 <\/span><span style=\"font-weight: 400;\">Eu gosto de bal\u00f5es<\/span><span style=\"font-weight: 400;\">Para obter coment\u00e1rios, use a tecla <\/span><span style=\"font-weight: 400;\">I-like-balloons::comments<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pesquisar todos os usu\u00e1rios de \"<em>Ohio<\/em>&#8220;<\/span><\/td>\n<td><span style=\"font-weight: 400;\">N\u00e3o<\/span><\/td>\n<td><span style=\"font-weight: 400;\">O estado do usu\u00e1rio \u00e9 provavelmente um atributo \"secund\u00e1rio\", n\u00e3o uma chave (v\u00e1rios usu\u00e1rios podem ser de Ohio). Esse \u00e9 um bom caso de uso para o SQL++<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Pesquisar produtos com \"<em>bal\u00f5es<\/em>\" em sua descri\u00e7\u00e3o<\/span><\/td>\n<td><span style=\"font-weight: 400;\">N\u00e3o<\/span><\/td>\n<td><span style=\"font-weight: 400;\">As descri\u00e7\u00f5es s\u00e3o um atributo secund\u00e1rio, n\u00e3o uma chave (v\u00e1rios produtos podem ter \"bal\u00f5es\" em sua descri\u00e7\u00e3o). Esse \u00e9 um bom caso de uso para a Pesquisa de texto completo (FTS)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Observe que o Couchbase tem uma arquitetura que prioriza a mem\u00f3ria. O cache interno significa que uma pesquisa de valor-chave geralmente recupera dados diretamente da mem\u00f3ria - lat\u00eancia de microssegundos, sem espera no disco.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Minha regra geral \u00e9: use a API de valor-chave sempre que poss\u00edvel e, quando necess\u00e1rio, recorra a uma op\u00e7\u00e3o mais flex\u00edvel, como SQL++ ou Full-Text Search.<\/span><\/p>\n<h2><b>Criar um ponto de extremidade Get CRUD<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Vamos criar um ponto de extremidade que use a API de valor-chave para recuperar um \u00fanico item da lista de desejos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Esse ponto de extremidade exigir\u00e1 que a ID do item da lista de desejos seja fornecida como par\u00e2metro:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:c# decode:true\">[HttpGet]\r\n[Route(\"api\/get\/{id}\")]\r\npublic async Task&lt;IActionResult&gt; Get(Guid id)\r\n{\r\n   var bucket = await _bucketProvider.GetBucketAsync(\"demo\");\r\n   var collection = await bucket.CollectionAsync(\"wishlist\");\r\n\r\n   var item = await collection.GetAsync(id.ToString());\r\n\r\n   return Ok(item.ContentAs&lt;WishlistItem&gt;());\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Neste exemplo, n\u00e3o precisamos de um <\/span><span style=\"font-weight: 400;\">agrupamento<\/span><span style=\"font-weight: 400;\"> (como fizemos com o SQL++), mas precisamos de um objeto <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/scopes-and-collections-for-modern-multi-tenant-applications-couchbase-7-0\/\"><span style=\"font-weight: 400;\">cole\u00e7\u00e3o<\/span><\/a><span style=\"font-weight: 400;\"> objeto. Observe que, como a cole\u00e7\u00e3o de listas de desejos est\u00e1 no objeto <em>Padr\u00e3o<\/em>\u00a0escopo, podemos <\/span><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/concept-docs\/collections.html#using-collections-scopes\"><span style=\"font-weight: 400;\">pular a obten\u00e7\u00e3o do escopo e ir diretamente do balde para a cole\u00e7\u00e3o<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Quando o item \u00e9 devolvido da <\/span><em><span style=\"font-weight: 400;\">GetAsync<\/span><\/em><span style=\"font-weight: 400;\">, est\u00e1 em um <\/span><em><span style=\"font-weight: 400;\">IGetResult<\/span><\/em><span style=\"font-weight: 400;\"> objeto. O Couchbase n\u00e3o armazena objetos C#, ele armazena JSON. Portanto, para serializar em um objeto <\/span><em><span style=\"font-weight: 400;\">Item da lista de desejos<\/span><\/em><span style=\"font-weight: 400;\"> objeto, use <\/span><em><span style=\"font-weight: 400;\">item.ContentAs<\/span><\/em><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Essa API lhe d\u00e1 flexibilidade: um documento retornado do Couchbase pode ser serializado para <\/span><em><span style=\"font-weight: 400;\">Item da lista de desejos<\/span><\/em><span style=\"font-weight: 400;\"> aqui e talvez <\/span><em><span style=\"font-weight: 400;\">AmazonWishlistItem<\/span><\/em><span style=\"font-weight: 400;\"> em outra parte do aplicativo.<\/span><\/p>\n<h2><b>Chave-valor em a\u00e7\u00e3o<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Execute o aplicativo ASP.NET Core e vamos dar uma olhada na p\u00e1gina OpenAPI\/Swagger atualizada.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13179\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/05\/image1.png\" alt=\"ASP core dotnet tutorial with Couchbase\" width=\"811\" height=\"408\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1.png 811w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-300x151.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-768x386.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-20x10.png 20w\" sizes=\"auto, (max-width: 811px) 100vw, 811px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">O ponto de extremidade <\/span><em><span style=\"font-weight: 400;\">\/api\/get\/{id}<\/span><\/em><span style=\"font-weight: 400;\"> sob <em>Presentes<\/em>\u00a0deve estar listado. Expanda esse endpoint clicando nele. Ao contr\u00e1rio do <\/span><em><span style=\"font-weight: 400;\">\/api\/getall<\/span><\/em><span style=\"font-weight: 400;\"> esse ponto de extremidade requer um par\u00e2metro: o ID do item da lista de desejos que voc\u00ea deseja obter. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Se voc\u00ea n\u00e3o se lembrar de um dos GUIDs, poder\u00e1 executar <\/span><em><span style=\"font-weight: 400;\">\/api\/getall<\/span><\/em><span style=\"font-weight: 400;\"> primeiro e copie um deles, ou use: \"<em>31c9cc33-8dfe-440c-bd1b-bb038939d2e0<\/em>\" (que foi a identifica\u00e7\u00e3o que dei \u00e0 camisa do Joey Votto). Clique aqui <strong>Experimente<\/strong>, cole essa ID e clique em <strong>Executar<\/strong>:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13180\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/05\/testing-aspnet-core-endpoint-couchbase.png\" alt=\"Test the ASPNET Core Couchbase Endpoint \" width=\"764\" height=\"449\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/testing-aspnet-core-endpoint-couchbase.png 764w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/testing-aspnet-core-endpoint-couchbase-300x176.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/testing-aspnet-core-endpoint-couchbase-20x12.png 20w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Observe que, na resposta, a ID retornada \u00e9 <\/span><span style=\"font-weight: 400;\">nulo<\/span><span style=\"font-weight: 400;\">. Isso se deve ao fato de que, como expliquei em <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-crud-nosql-part-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Parte 2<\/span><\/a><span style=\"font-weight: 400;\">O Couchbase armazena o ID como metadados. Nessa situa\u00e7\u00e3o, isso n\u00e3o \u00e9 um grande problema. O ID foi fornecido como par\u00e2metro, portanto, voc\u00ea poderia simplesmente atribu\u00ed-lo ao objeto C# que est\u00e1 sendo retornado:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:c# decode:true\">var itemObj = item.ContentAs&lt;WishlistItem&gt;();\r\nitemObj.Id = Guid.Parse(id);\r\n\r\nreturn Ok(itemObj);<\/pre>\n<p><span style=\"font-weight: 400;\">Como alternativa, se voc\u00ea n\u00e3o quiser retornar a ID <\/span><span style=\"font-weight: 400;\">voc\u00ea pode criar uma classe de visualiza\u00e7\u00e3o C# separada que tenha apenas <\/span><em><span style=\"font-weight: 400;\">nome<\/span><\/em><span style=\"font-weight: 400;\"><em>\u00a0<\/em>e us\u00e1-lo com <\/span><em><span style=\"font-weight: 400;\">ContentAs<\/span><\/em><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><b>E quanto \u00e0 valida\u00e7\u00e3o e ao tratamento de erros?<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Que sensato de sua parte perguntar! Esse endpoint definitivamente n\u00e3o est\u00e1 pronto para a produ\u00e7\u00e3o. O que est\u00e1 faltando?<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Tratamento de erros: e se houver uma exce\u00e7\u00e3o?<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Valida\u00e7\u00e3o: e se a ID informada for inv\u00e1lida?<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Autentica\u00e7\u00e3o\/autoriza\u00e7\u00e3o: e se o consumidor dessa API n\u00e3o tiver acesso de leitura?<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Registro: e se algo n\u00e3o der muito certo e quisermos examinar o resultado mais tarde?<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Todas essas s\u00e3o preocupa\u00e7\u00f5es importantes. Para a maioria delas, o ASP.NET Core tem funcionalidade integrada e\/ou bibliotecas populares de terceiros dispon\u00edveis para ajudar voc\u00ea. Mas n\u00e3o deixe de conferir a documenta\u00e7\u00e3o do Couchbase em <\/span><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/error-handling.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Manipula\u00e7\u00e3o de erros com o .NET SDK<\/span><\/a><span style=\"font-weight: 400;\"> e <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-security\/security-management-overview.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Vis\u00e3o geral do gerenciamento de seguran\u00e7a<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><b>O que vem a seguir?<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">O projeto ASP.NET Core est\u00e1 conectado ao Couchbase Capella e est\u00e1 lendo dados por meio do SQL++ e da API de valor-chave.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Na pr\u00f3xima postagem do blog, veremos como criar e atualizar dados (\"C\" e \"U\").<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nesse meio tempo, voc\u00ea deve:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/cloud.couchbase.com\/sign-up\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Inscreva-se para um teste gratuito do Capella<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Confira o <\/span><a href=\"https:\/\/cloud.couchbase.com\/sign-up\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Couchbase Playground para .NET<\/span><\/a><span style=\"font-weight: 400;\"> exemplos que voc\u00ea pode executar diretamente no navegador.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>ASP.NET CRUD applications consist of create, read, update, and delete. In part 1, we set up a basic ASP.NET Core project. In part 2, we added the first read endpoint, using a SQL++ query against wishlist data. Couchbase\u2019s SQL++ is [&hellip;]<\/p>","protected":false},"author":71,"featured_media":13181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10126,10127,1816,2201],"tags":[],"ppma_author":[8937],"class_list":["post-13178","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-asp-dotnet","category-c-sharp","category-couchbase-server","category-tools-sdks"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ASP.NET Core CRUD with NoSQL: Part 3 - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Continue building an ASP.NET Core app for Couchbase - in this post, we add key-value NoSQL document retrieval capabilities and test endpoints.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-core-crud-nosql-part-3\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ASP.NET Core CRUD with NoSQL: Part 3\" \/>\n<meta property=\"og:description\" content=\"Continue building an ASP.NET Core app for Couchbase - in this post, we add key-value NoSQL document retrieval capabilities and test endpoints.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-core-crud-nosql-part-3\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-05T15:04:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:56:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1706\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"ASP.NET Core CRUD with NoSQL: Part 3\",\"datePublished\":\"2022-05-05T15:04:00+00:00\",\"dateModified\":\"2025-06-14T03:56:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/\"},\"wordCount\":1022,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg\",\"articleSection\":[\".NET\",\"ASP.NET\",\"C#\",\"Couchbase Server\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/\",\"name\":\"ASP.NET Core CRUD with NoSQL: Part 3 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg\",\"datePublished\":\"2022-05-05T15:04:00+00:00\",\"dateModified\":\"2025-06-14T03:56:45+00:00\",\"description\":\"Continue building an ASP.NET Core app for Couchbase - in this post, we add key-value NoSQL document retrieval capabilities and test endpoints.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg\",\"width\":2560,\"height\":1706,\"caption\":\"ASP.NET Core CRUD app\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ASP.NET Core CRUD with NoSQL: Part 3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ASP.NET Core CRUD with NoSQL: Part 3 - The Couchbase Blog","description":"Continue criando um aplicativo ASP.NET Core para o Couchbase - nesta postagem, adicionamos recursos de recupera\u00e7\u00e3o de documentos NoSQL de valor-chave e pontos de extremidade de teste.","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:\/\/www.couchbase.com\/blog\/pt\/asp-net-core-crud-nosql-part-3\/","og_locale":"pt_BR","og_type":"article","og_title":"ASP.NET Core CRUD with NoSQL: Part 3","og_description":"Continue building an ASP.NET Core app for Couchbase - in this post, we add key-value NoSQL document retrieval capabilities and test endpoints.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/asp-net-core-crud-nosql-part-3\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-05-05T15:04:00+00:00","article_modified_time":"2025-06-14T03:56:45+00:00","og_image":[{"width":2560,"height":1706,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"ASP.NET Core CRUD with NoSQL: Part 3","datePublished":"2022-05-05T15:04:00+00:00","dateModified":"2025-06-14T03:56:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/"},"wordCount":1022,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg","articleSection":[".NET","ASP.NET","C#","Couchbase Server","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/","url":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/","name":"ASP.NET Core CRUD with NoSQL: Part 3 - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg","datePublished":"2022-05-05T15:04:00+00:00","dateModified":"2025-06-14T03:56:45+00:00","description":"Continue criando um aplicativo ASP.NET Core para o Couchbase - nesta postagem, adicionamos recursos de recupera\u00e7\u00e3o de documentos NoSQL de valor-chave e pontos de extremidade de teste.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/aspdotnet-core-app-development-couchbase-scaled.jpg","width":2560,"height":1706,"caption":"ASP.NET Core CRUD app"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-core-crud-nosql-part-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ASP.NET Core CRUD with NoSQL: Part 3"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves \u00e9 um cara que adora programar. N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"Matthew D. Groves \u00e9 um cara que adora programar.  N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa.  Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90.  Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores.  Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=13178"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13178\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13181"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=13178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=13178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=13178"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=13178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}