{"id":13618,"date":"2022-08-02T09:46:48","date_gmt":"2022-08-02T16:46:48","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13618"},"modified":"2025-06-13T20:56:42","modified_gmt":"2025-06-14T03:56:42","slug":"asp-net-crud-nosql-part-5","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/asp-net-crud-nosql-part-5\/","title":{"rendered":"ASP.NET Core CRUD con NoSQL: Parte 5"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Esta serie de ASP.NET Core CRUD est\u00e1 llegando a su fin. Hemos cubierto <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-core-crud-with-nosql-part-1\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">configuraci\u00f3n (parte 1)<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-crud-nosql-part-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">lectura con SQL++ (parte 2)<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-core-crud-nosql-part-3\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">lectura con clave-valor (parte 3)<\/span><\/a><span style=\"font-weight: 400;\">y <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-core-crud-nosql-part-4\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">crear\/actualizar (parte 4)<\/span><\/a><span style=\"font-weight: 400;\">. En este \u00faltimo post, veremos la <strong>D<\/strong> en <strong>CRUD<\/strong>: <em>borrar<\/em>.<\/span><\/p>\n<h2><b>Borrado con SQL++ o clave-valor<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Espero que est\u00e9s notando un patr\u00f3n. Al igual que con la lectura, creaci\u00f3n y actualizaci\u00f3n, tienes m\u00faltiples caminos para borrar. Puedes usar un SQL++ <\/span><em><span style=\"font-weight: 400;\">BORRAR<\/span><\/em><span style=\"font-weight: 400;\"> declaraci\u00f3n:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">DELETE FROM demo._default.wishlist w\r\nWHERE META(w).id = \"1c3de2e7-70ea-4ee2-803b-425bbf6251cb\"<\/pre>\n<p><span style=\"font-weight: 400;\">Tambi\u00e9n puede utilizar una operaci\u00f3n de eliminaci\u00f3n de clave-valor (tambi\u00e9n conocida como \"<em>Eliminar<\/em>&#8220;):<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">await collection.RemoveAsync(\"1c3de2e7-70ea-4ee2-803b-425bbf6251cb\");<\/pre>\n<p><span style=\"font-weight: 400;\">Y como antes, aqu\u00ed tienes unas pautas muy parecidas para ayudarte a decidir cu\u00e1l utilizar:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Caso pr\u00e1ctico<\/strong><\/td>\n<td><strong>\u00bfClave-valor?<\/strong><\/td>\n<td><strong>\u00bfPor qu\u00e9 s\u00ed o por qu\u00e9 no?<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Eliminar un usuario con clave \"73892\"<\/span><\/td>\n<td><span style=\"font-weight: 400;\">S\u00ed<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Acceso directo<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Eliminar un grupo de usuarios con las claves \"73892\", \"47212\" y \"90491\".<\/span><\/td>\n<td><span style=\"font-weight: 400;\">S\u00ed<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Esto puede requerir m\u00faltiples operaciones clave-valor, pero a\u00fan as\u00ed puede ser m\u00e1s r\u00e1pido que utilizar un SQL <\/span><em><span style=\"font-weight: 400;\">SUPRIMIR ... DONDE ... EN<\/span><\/em><span style=\"font-weight: 400;\"> consulta.<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Borrar todos los usuarios de \"Ohio\"<\/span><\/td>\n<td><span style=\"font-weight: 400;\">No<\/span><\/td>\n<td><span style=\"font-weight: 400;\">El estado del usuario es probablemente un atributo \"secundario\", no una clave (varios usuarios pueden ser de Ohio). Este es un buen caso de uso para un SQL++. <\/span><span style=\"font-weight: 400;\">BORRAR<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><b>Un punto final de eliminaci\u00f3n para ASP.NET Core<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Con esto en mente, crea un punto final de borrado como este:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">[HttpDelete]\r\n[Route(\"api\/delete\")]\r\npublic async Task Delete(Guid id)\r\n{\r\n    var bucket = await _bucketProvider.GetBucketAsync(\"demo\");\r\n    var collection = await bucket.CollectionAsync(\"wishlist\");\r\n\r\n    await collection.RemoveAsync(id.ToString());\r\n\r\n    return Ok(new { success = true });\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Pruebe este endpoint con OpenAPI \/ Swagger, y se comportar\u00e1 como cabr\u00eda esperar.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13620\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/08\/delete-endpoint-couchbase-asp-net-api.png\" alt=\"Swagger API view of Couchbase ASP.NET endpoints\" width=\"828\" height=\"745\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/delete-endpoint-couchbase-asp-net-api.png 828w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/delete-endpoint-couchbase-asp-net-api-300x270.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/delete-endpoint-couchbase-asp-net-api-768x691.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/delete-endpoint-couchbase-asp-net-api-20x18.png 20w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/p>\n<h2><b>\u00bfDeber\u00eda borrarlo?<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">En muchos casos de uso, es posible que no desee <\/span><b>en realidad<\/b><span style=\"font-weight: 400;\"> borrar datos. Puede que quiera hacer algo llamado borrado \"suave\". Esto implica mover o marcar los datos de tal forma que sigan existiendo en la base de datos, pero ya no se muestren al usuario final. Esto tiene la ventaja de que se pueden descubrir, recuperar y notificar.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Tambi\u00e9n es una gran oportunidad para mostrar la flexibilidad de una base de datos JSON NoSQL.<\/span><\/p>\n<h2><b>Borrado suave<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Introduzcamos un campo \"eliminado\" en los elementos de la lista de deseos. Este campo contendr\u00e1 la fecha\/hora en que se elimin\u00f3 el art\u00edculo. Si este campo existe, el resto del endpoint deber\u00eda considerar que este art\u00edculo ha sido eliminado. Sin embargo, si lo necesitamos, a\u00fan podemos consultarlo, informar sobre \u00e9l y recuperarlo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">En una base de datos relacional, esto requerir\u00eda probablemente un <\/span><em><span style=\"font-weight: 400;\">ALTERAR<\/span><\/em><span style=\"font-weight: 400;\">. Dependiendo del tama\u00f1o de tus datos, podr\u00eda requerir alg\u00fan tiempo de inactividad, o posiblemente un mont\u00f3n de valores NULL. En una base de datos JSON, no necesitamos decirle nada a la base de datos sobre un nuevo campo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Utilicemos el <\/span><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/subdocument-operations.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">API de subdocumentos<\/span><\/a><span style=\"font-weight: 400;\"> para a\u00f1adir un \"<em>suprimido<\/em>\"al documento. Subdocumento significa que s\u00f3lo operaremos sobre un <\/span><b>porci\u00f3n<\/b><span style=\"font-weight: 400;\"> del JSON, y dejar el resto solo.<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">[HttpDelete]\r\n[Route(\"api\/softDelete\")]\r\npublic async Task SoftDelete(Guid id)\r\n{\r\n    var bucket = await _bucketProvider.GetBucketAsync(\"demo\");\r\n    var collection = await bucket.CollectionAsync(\"wishlist\");\r\n\r\n    await collection.MutateInAsync(id.ToString(),\r\n        options =&gt; options.Upsert(\"eliminado\", DateTime.Now));\r\n\r\n    return Ok(new { \u00e9xito = verdadero });\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">(Aseg\u00farese de que <\/span><span style=\"font-weight: 400;\">utilizando <em>Couchbase.KeyValue;<\/em><\/span><span style=\"font-weight: 400;\"> est\u00e1 en la parte superior de su <em>GiftsController<\/em> archivo).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Este c\u00f3digo env\u00eda una orden a Couchbase: <\/span><span style=\"font-weight: 400;\">para el documento con tal y tal ID, upsert un campo llamado \"<em>suprimido<\/em>\"y dale como valor la fecha\/hora actual<\/span><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">F\u00edjate en que con el subdocumento no tenemos que cargar primero el documento existente y no tenemos que enviar todo el documento modificado de vuelta a trav\u00e9s del cable.<\/span><\/p>\n<h2><b>Datos borrados<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">El resultado final ser\u00e1 un documento con este aspecto:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"nombre\": \"Marco de fotos digital\",\r\n  \"deleted\": \"2022-04-21T11:05:26.1766248-04:00\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Los dem\u00e1s documentos de mi lista de deseos s\u00ed <\/span><b>no<\/b><span style=\"font-weight: 400;\"> tener un <\/span><span style=\"font-weight: 400;\">suprimido<\/span><span style=\"font-weight: 400;\"> campo. Siguen pareciendo:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"nombre\": \"Camiseta Skyline Chili 2XL\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">y<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"nombre\": \"Joey Votto jersey\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Tenga en cuenta que no tienen <\/span><em><span style=\"font-weight: 400;\">\"suprimido\": null<\/span><\/em><span style=\"font-weight: 400;\"> campo; no tienen <\/span><span style=\"font-weight: 400;\">&#8220;<em>suprimido<\/em>&#8220;<\/span><span style=\"font-weight: 400;\"> campo en absoluto.<\/span><\/p>\n<h2><b>Borrado suave SELECT<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Los datos son <\/span><b>marcado<\/b><span style=\"font-weight: 400;\"> como eliminado, pero sigue en la base de datos. Tenemos que modificar el <\/span><em><span style=\"font-weight: 400;\">GetAll<\/span><\/em><span style=\"font-weight: 400;\"> punto final (<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-crud-nosql-part-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">consulte la parte 2 para obtener m\u00e1s informaci\u00f3n <\/span><span style=\"font-weight: 400;\">GetAll<\/span><\/a><span style=\"font-weight: 400;\">) para tenerlo en cuenta:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">SELECT META(w).id, w.*\r\nFROM demo._default.wishlist w\r\nWHERE w.deleted IS MISSING<\/pre>\n<p><span style=\"font-weight: 400;\">Aqu\u00ed he introducido algo m\u00e1s de sintaxis SQL++: <\/span><em><span style=\"font-weight: 400;\">FALTA<\/span><\/em><span style=\"font-weight: 400;\">. Se trata de un concepto que no existe en las bases de datos relacionales. En relacional, cualquier columna especificada en la consulta debe estar definida y debe tener un valor (incluso si es nulo). Con una base de datos de documentos JSON NoSQL, no existe tal restricci\u00f3n.<\/span><\/p>\n<h2><b>Mejorar el \u00edndice<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Un \u00faltimo punto a tratar es la indexaci\u00f3n. En <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-crud-nosql-part-2\/\"><span style=\"font-weight: 400;\">parte 2<\/span><\/a><span style=\"font-weight: 400;\">hemos creado un \u00edndice primario para empezar. Sin embargo, ese \u00edndice rara vez ser\u00e1 el m\u00e1s eficiente. <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/services-and-indexes\/indexes\/global-secondary-indexes.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Creaci\u00f3n y ajuste de \u00edndices<\/span><\/a><span style=\"font-weight: 400;\"> es un tema profundo, como lo es en el mundo de las bases de datos relacionales.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Afortunadamente, Couchbase Capella tiene incorporado un <\/span><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/query-service\/query-workbench.html#index-advisor\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\"><strong>Aconsejar<\/strong> herramienta<\/span><\/a><span style=\"font-weight: 400;\"> que puede recomendar mejores \u00edndices. Haga clic en <strong>Aconsejar<\/strong>\u00a0en el Query Workbench (o puede utilizar <\/span><em><span style=\"font-weight: 400;\">CONSEJO<\/span><\/em><span style=\"font-weight: 400;\"> sintaxis).<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13621\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/08\/query_advise_couchbase_sql-asp-net.png\" alt=\"Index adviser recommendations in Couchbase\" width=\"958\" height=\"637\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/query_advise_couchbase_sql-asp-net.png 958w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/query_advise_couchbase_sql-asp-net-300x199.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/query_advise_couchbase_sql-asp-net-768x511.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/query_advise_couchbase_sql-asp-net-400x267.png 400w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/query_advise_couchbase_sql-asp-net-450x300.png 450w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/query_advise_couchbase_sql-asp-net-20x13.png 20w\" sizes=\"auto, (max-width: 958px) 100vw, 958px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">En este caso, da la siguiente recomendaci\u00f3n:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">\"\u00edndices_recomendados\": {\r\n          \"indexes\": [\r\n            {\r\n              \"index_statement\": \"CREATE INDEX adv_deletedISMISSING ON `default`:`demo`.`_default`.`wishlist`(`deleted` IS MISSING) WHERE `deleted` IS MISSING\",\r\n              \"index_statement_relative\": \"CREATE INDEX adv_deletedISMISSING ON `wishlist`(`deleted` IS MISSING) WHERE `deleted` IS MISSING\",\r\n              \"keyspace_alias\": \"wishlist_w\",\r\n              \"query_context\": \"default:demo._default\",\r\n              \"recommendeding_rule\": \"Las claves del \u00edndice siguen el orden de los tipos de predicado: 2. igualdad\/nulo\/falta\".\r\n            }\r\n          ]\r\n        }<\/pre>\n<p><span style=\"font-weight: 400;\">En el caso de nuestra peque\u00f1\u00edsima cantidad de datos de listas de deseos, probablemente no merezca la pena crear este \u00edndice. Sin embargo, si estuvi\u00e9ramos gestionando las listas de deseos de todo un sitio de comercio electr\u00f3nico (por ejemplo), este \u00edndice ser\u00eda un buen punto de partida.<\/span><\/p>\n<h2><b>El fin del CRUD<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Hemos llegado al final de la creaci\u00f3n de una aplicaci\u00f3n ASP.NET Core CRUD muy sencilla con Couchbase. La superficie final de la API tiene este aspecto:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13619\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/08\/coucbase-asp-net-full-api-sample.png\" alt=\"Full API example of Couchbase ASP.NET app\" width=\"842\" height=\"603\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/coucbase-asp-net-full-api-sample.png 842w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/coucbase-asp-net-full-api-sample-300x215.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/coucbase-asp-net-full-api-sample-768x550.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/coucbase-asp-net-full-api-sample-20x14.png 20w\" sizes=\"auto, (max-width: 842px) 100vw, 842px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Aqu\u00ed tienes un desglose de los conceptos de esta serie, con enlaces a documentaci\u00f3n para profundizar:<\/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:\/\/docs.couchbase.com\/cloud\/get-started\/get-started.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Configuraci\u00f3n de Capella<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/managing-connections.html#connection-di\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Configuraci\u00f3n de la inyecci\u00f3n de dependencias .NET<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/n1ql-queries-with-sdk.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">SQL<\/span><\/a><span style=\"font-weight: 400;\"> (a veces se sigue llamando \"N1QL\")<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/query-service\/query-workbench.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Workbench de consulta<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/select.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">SELECCIONE<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/insert.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">INSERTAR<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/update.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">ACTUALIZACI\u00d3N<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/delete.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">BORRAR<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/upsert.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">UPSERT<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/guides\/create-index.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">CREAR \u00cdNDICE<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/query-service\/query-workbench.html#index-advisor\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Asesor de \u00edndices<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/kv-operations.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Clave-valor (.NET SDK)<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/kv-operations.html#crud-operations\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Operaciones CRUD clave-valor<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/subdocument-operations.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Subdocumento<\/span><\/a><span style=\"font-weight: 400;\"> operaciones<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/distributed-acid-transactions-from-the-sdk.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Transacciones ACID<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/135AspNetCoreGettingStartedUpdated2019\/src\/AspNetCoreTutorial\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">El c\u00f3digo fuente completo de esta serie est\u00e1 disponible en GitHub<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><b>\u00bfY ahora qu\u00e9?<\/b><\/h2>\n<p><a href=\"https:\/\/cloud.couchbase.com\/sign-up\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Prueba gratuita de Capella<\/span><\/a><span style=\"font-weight: 400;\">. Couchbase Capella DBaaS es la forma m\u00e1s f\u00e1cil de empezar con Couchbase, y no se requiere tarjeta de cr\u00e9dito.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Echa un vistazo a la <\/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;\"> que puede ejecutar directamente en el navegador.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00danete al <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-on-discord\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Couchbase Discord<\/span><\/a><span style=\"font-weight: 400;\"> para hacer preguntas e intercambiar comentarios con los ingenieros de Couchbase y con otros miembros de la comunidad Couchbase.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>This ASP.NET Core CRUD series is coming to end. We\u2019ve covered setup (part 1), reading with SQL++ (part 2), reading with key-value (part 3), and creating\/updating (part 4). In this last post, we\u2019ll look at the D in CRUD: deleting. [&hellip;]<\/p>","protected":false},"author":71,"featured_media":13623,"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-13618","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.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ASP.NET Core CRUD with NoSQL: Part 5<\/title>\n<meta name=\"description\" content=\"Learn about deleting with SQL++ or Key-Value, soft-deleting data, improving the index, and more. Sign up for a Capella free-trial and try it for yourself.\" \/>\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\/es\/asp-net-crud-nosql-part-5\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ASP.NET Core CRUD with NoSQL: Part 5\" \/>\n<meta property=\"og:description\" content=\"Learn about deleting with SQL++ or Key-Value, soft-deleting data, improving the index, and more. Sign up for a Capella free-trial and try it for yourself.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/asp-net-crud-nosql-part-5\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-02T16:46:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:56:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"2560\" \/>\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-crud-nosql-part-5\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"ASP.NET Core CRUD with NoSQL: Part 5\",\"datePublished\":\"2022-08-02T16:46:48+00:00\",\"dateModified\":\"2025-06-14T03:56:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/\"},\"wordCount\":906,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg\",\"articleSection\":[\".NET\",\"ASP.NET\",\"C#\",\"Couchbase Server\",\"Tools &amp; SDKs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/\",\"name\":\"ASP.NET Core CRUD with NoSQL: Part 5\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg\",\"datePublished\":\"2022-08-02T16:46:48+00:00\",\"dateModified\":\"2025-06-14T03:56:42+00:00\",\"description\":\"Learn about deleting with SQL++ or Key-Value, soft-deleting data, improving the index, and more. Sign up for a Capella free-trial and try it for yourself.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg\",\"width\":2560,\"height\":2560,\"caption\":\"Adding DELETE CRUD to ASP.NET Couchbase app\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#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 5\"}]},{\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ASP.NET Core CRUD con NoSQL: Parte 5","description":"Aprenda sobre la eliminaci\u00f3n con SQL++ o Clave-Valor, la eliminaci\u00f3n suave de datos, la mejora del \u00edndice y mucho m\u00e1s. Reg\u00edstrese para una prueba gratuita de Capella y pru\u00e9belo usted mismo.","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\/es\/asp-net-crud-nosql-part-5\/","og_locale":"es_MX","og_type":"article","og_title":"ASP.NET Core CRUD with NoSQL: Part 5","og_description":"Learn about deleting with SQL++ or Key-Value, soft-deleting data, improving the index, and more. Sign up for a Capella free-trial and try it for yourself.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/asp-net-crud-nosql-part-5\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-08-02T16:46:48+00:00","article_modified_time":"2025-06-14T03:56:42+00:00","og_image":[{"width":2560,"height":2560,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-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-crud-nosql-part-5\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"ASP.NET Core CRUD with NoSQL: Part 5","datePublished":"2022-08-02T16:46:48+00:00","dateModified":"2025-06-14T03:56:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/"},"wordCount":906,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg","articleSection":[".NET","ASP.NET","C#","Couchbase Server","Tools &amp; SDKs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/","url":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/","name":"ASP.NET Core CRUD con NoSQL: Parte 5","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg","datePublished":"2022-08-02T16:46:48+00:00","dateModified":"2025-06-14T03:56:42+00:00","description":"Aprenda sobre la eliminaci\u00f3n con SQL++ o Clave-Valor, la eliminaci\u00f3n suave de datos, la mejora del \u00edndice y mucho m\u00e1s. Reg\u00edstrese para una prueba gratuita de Capella y pru\u00e9belo usted mismo.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/couchbase-asp-net-crud-app-scaled.jpg","width":2560,"height":2560,"caption":"Adding DELETE CRUD to ASP.NET Couchbase app"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/asp-net-crud-nosql-part-5\/#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 5"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"es","@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":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/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":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=13618"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13618\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13623"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13618"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}