{"id":3721,"date":"2017-06-13T07:17:28","date_gmt":"2017-06-13T14:17:28","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3721"},"modified":"2025-06-13T20:40:55","modified_gmt":"2025-06-14T03:40:55","slug":"build-photogallery-app-aws-rekognition-and-couchbase-part2","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/","title":{"rendered":"Crear una aplicaci\u00f3n de galer\u00eda de fotos con etiquetado autom\u00e1tico mediante AWS Rekognition y Couchbase - Parte 2"},"content":{"rendered":"<p><em><a href=\"https:\/\/www.linkedin.com\/in\/ratnopam-chakrabarti\" target=\"_blank\" rel=\"noopener noreferrer\">Ratnopam Chakrabarti<\/a>\u00a0is a software developer currently working for Ericsson Inc. He has been focused on IoT, machine-to-machine technologies, connected cars, and smart city domains for quite a while. He loves learning new technologies and putting them to work. When he\u2019s not working, he enjoys spending time with his 3-year-old son.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2542\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/ratnopamchakrabarti2.jpeg\" alt=\"Ratnopam Chakrabarti\" width=\"150\" height=\"200\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2.jpeg 150w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/ratnopamchakrabarti2-15x20.jpeg 15w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/p>\n<p>In <a href=\"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-couchbase\/\">Part 1 of this blog series<\/a>, we looked at how we can store and retrieve image metadata to and from a Couchbase bucket. In this post (Part 2), we will take a look at the \u201clikes\u201d and show by tagname features of the app.<\/p>\n<p>The idea here is to use HTML and jQuery on the client side that interact with the node components such as route.js running on the server side. For instance, the following jQuery snippet sits on the client side and makes an Ajax call to the \u201cURL\u201d which is exposed as a <em>route <\/em>inside route.js on the server side.<\/p>\n<p>The <em>like<\/em>\u00a0is an anchor element on click of which a new route gets called in the node app. Here\u2019s the snippet:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:default decode:true \">$(document).on('click', '.like', function(e){\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 console.log('Like clicked');\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var that = $(this);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var URL = host + '\/like\/' + that.data('photoid');\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ajax({\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 url: URL,\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 success:function(data){\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var parseData = JSON.parse(data.response);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 that.find('h4').html(parseData.likes);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 })\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 })\r\n\r\n<\/pre>\n<p>The URL is formed by appending the \u2018\/like\/\u2019 and the id of the image to the <em>host <\/em>variable. Once the Ajax call is made with success, the corresponding success callback parses the JSON response sent back from the server side (routes.js) endpoint.<\/p>\n<p>The corresponding route for this (in routes.js) is shown below:<\/p>\n<pre class=\"lang:default decode:true \">router.get('\/like\/:id', function(req, res, next){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ImageModel.getByDocumentId(req.params.id, function(err, result){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var jsonFromDB = JSON.stringify(result);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var docFromDBArr = JSON.parse(jsonFromDB);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var docFromDB = docFromDBArr[0];\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var likes = docFromDB.likes;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ increment the like by 1\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0likes = likes + 1;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0docFromDB.likes = likes;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ImageModel.save(docFromDB, function(error, result) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(error) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res.status(400).send(error);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.status(200).send({likes:docFromDB.likes});\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\r\n\r\n})\r\n\r\n<\/pre>\n<p>The above route serves the call from the client side jQuery and also sends back a HTTP response of 200 and a JSON response body.<\/p>\n<p>The route makes a call to the <em>getByDocumentId <\/em>function exposed by the ImageModel. This function, as shown below, retrieves a document from the Couchbase bucket based on the document id passed as an argument. Once the document is retrieved successfully, the result is parsed and the <em>\u201clikes\u201d <\/em>is incremented by 1. The updated document is saved by calling the save() function.<\/p>\n<p>The getByDocumentId function (defined in recordmodel.js file):<\/p>\n<pre class=\"lang:default decode:true \">\/*\r\n\r\n\u00a0* Get a particular document from Couchbase Server using a parameterized N1QL query\r\n\r\n\u00a0*\/\r\n\r\nImageModel.getByDocumentId = function(documentId, callback) {\r\n\r\n\u00a0 \u00a0 var statement = \"SELECT META(photos).id, filename, likes, tags \" +\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"FROM `\" + config.couchbase.bucket + \"` AS photos \" +\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"WHERE META(photos).id = $1\";\r\n\r\n\u00a0 \u00a0 var query = N1qlQuery.fromString(statement);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.query(query, [documentId], function(error, result) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 if(error) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return callback(error, null);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 callback(null, result);\r\n\r\n\u00a0 \u00a0 });\r\n\r\n};<\/pre>\n<p>&nbsp;<\/p>\n<h3>Show Images by TagName<\/h3>\n<p>To list images by a particular tag, we need to do the following things:<\/p>\n<ul>\n<li>Pass the tagname when the anchor is clicked<\/li>\n<li>Use the tagname to filter out images<\/li>\n<\/ul>\n<p>The tagname is passed by the following simple jQquery:<\/p>\n<pre class=\"lang:default decode:true \">$(document).on('click', '.showTag', function(e){\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var that = $(this);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var tagURL = host + '\/getimages\/' + that.data('tagname');\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ajax({\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 url: tagURL,\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 success:function(data){\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 var imageList = JSON.parse(data.response);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 renderImagesByTag (imageList);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 })\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 })\r\n\r\n<\/pre>\n<p>And the corresponding route:<\/p>\n<pre class=\"lang:default decode:true \">router.get('\/getimages\/:tagname', function(req, res, next){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0console.log('inside getimages by tagname');\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ImageModel.getImagesByTag(req.params.tagname, function(err, result){\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var jsonFromDB = JSON.stringify(result);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.send(JSON.stringify(result));\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\r\n\r\n})<\/pre>\n<p>The <em>getImagesByTag <\/em>function is described below:<\/p>\n<pre class=\"lang:default decode:true \">ImageModel.getImagesByTag = function(tagName, callback) {\r\n\r\n\u00a0 \u00a0 var statement = \"SELECT META(photos).id, filename, likes, tags \" +\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"FROM `\" + config.couchbase.bucket + \"` AS photos WHERE $1 IN tags\";\r\n\r\n\u00a0 \u00a0 var query = N1qlQuery.fromString(statement);\r\n\r\n\u00a0 \u00a0 db.query(query, [tagName], function(error, result) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 if(error) {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return callback(error, null);\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 callback(null, result);\r\n\r\n\u00a0 \u00a0 });\r\n\r\n};\r\n\r\n<\/pre>\n<p>It simply runs the following query using N1QL:<\/p>\n<p><em>select filename, likes from photogallery where &lt;tagname&gt; IN tags;<\/em><\/p>\n<p>This allows filtering on the basis of tagname where tags is an array of strings.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/06\/pasted-image-0-3.png\" alt=\"pasted image 0 3\" \/><\/p>\n<p>So, if we have two images with the same tag then the above query should return both images.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/06\/pasted-image-0-1.png\" alt=\"pasted image 0 1\" \/><\/p>\n<p>Here both the documents have a common tag named <strong>\u201cBlossom.\u201d <\/strong>Now, if we run the query using the Couchbase Query Workbench, we get the following result:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/06\/pasted-image-0-5.png\" alt=\"pasted image 0 5\" \/><\/p>\n<p>As expected, you can see two records are returned. This is in effect what\u2019s happening in the <em>getImagesByTag () <\/em>function.<\/p>\n<h3>Troubleshooting<\/h3>\n<p>During npm-install, if you face the following error,<\/p>\n<p>Can&#8217;t find Python executable &#8220;python,&#8221; you can set the PYTHON env variable<\/p>\n<p>then do the following to get rid of the error:<\/p>\n<p>Install python<\/p>\n<p>Add python to the path<\/p>\n<p>This should resolve the error\u00a0&#8230;\u00a0at least it did for me.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/community\/community-writers-program\/\"><em>This post is part of the Couchbase Community Writing Program<\/em><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ratnopam Chakrabarti\u00a0is a software developer currently working for Ericsson Inc. He has been focused on IoT, machine-to-machine technologies, connected cars, and smart city domains for quite a while. He loves learning new technologies and putting them to work. When he\u2019s [&hellip;]<\/p>\n","protected":false},"author":53,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810,1816],"tags":[10124],"ppma_author":[9026],"class_list":["post-3721","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile","category-couchbase-server","tag-amazon-web-services-aws"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Building a photogallery app with auto tagging - Part 2<\/title>\n<meta name=\"description\" content=\"Check out \u201clikes\u201d and show by tagname features of the app. In Part 1, we learned how to store and retrieve image metadata to and from a Couchbase bucket.\" \/>\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\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 2\" \/>\n<meta property=\"og:description\" content=\"Check out \u201clikes\u201d and show by tagname features of the app. In Part 1, we learned how to store and retrieve image metadata to and from a Couchbase bucket.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-06-13T14:17:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:40:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/CB-Blog_red-black-big.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Laura Czajkowski, Developer Community Manager, Couchbase\" \/>\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\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/\"},\"author\":{\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/5f1a0ece4e644bc8c037686fbc8f3220\"},\"headline\":\"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 2\",\"datePublished\":\"2017-06-13T14:17:28+00:00\",\"dateModified\":\"2025-06-14T03:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/\"},\"wordCount\":551,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Amazon Web Services (AWS)\"],\"articleSection\":[\"Couchbase Mobile\",\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/\",\"name\":\"Building a photogallery app with auto tagging - Part 2\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-06-13T14:17:28+00:00\",\"dateModified\":\"2025-06-14T03:40:55+00:00\",\"description\":\"Check out \u201clikes\u201d and show by tagname features of the app. In Part 1, we learned how to store and retrieve image metadata to and from a Couchbase bucket.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2022\\\/11\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/build-photogallery-app-aws-rekognition-and-couchbase-part2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 2\"}]},{\"@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\\\/5f1a0ece4e644bc8c037686fbc8f3220\",\"name\":\"Laura Czajkowski, Developer Community Manager, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g9deb07d5daaa00220534c31768bc4409\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g\",\"caption\":\"Laura Czajkowski, Developer Community Manager, Couchbase\"},\"description\":\"Laura Czajkowski is the Snr. Developer Community Manager at Couchbase overseeing the community. She\u2019s responsible for our monthly developer newsletter.\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/es\\\/author\\\/laura-czajkowski\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Building a photogallery app with auto tagging - Part 2","description":"Echa un vistazo a los \"me gusta\" y mostrar por tagname caracter\u00edsticas de la aplicaci\u00f3n. En la Parte 1, aprendimos a almacenar y recuperar metadatos de im\u00e1genes desde y hacia un bucket de Couchbase.","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\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/","og_locale":"es_MX","og_type":"article","og_title":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 2","og_description":"Check out \u201clikes\u201d and show by tagname features of the app. In Part 1, we learned how to store and retrieve image metadata to and from a Couchbase bucket.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-06-13T14:17:28+00:00","article_modified_time":"2025-06-14T03:40:55+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/06\/CB-Blog_red-black-big.png","type":"image\/png"}],"author":"Laura Czajkowski, Developer Community Manager, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Laura Czajkowski, Developer Community Manager, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/"},"author":{"name":"Laura Czajkowski, Developer Community Manager, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/5f1a0ece4e644bc8c037686fbc8f3220"},"headline":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 2","datePublished":"2017-06-13T14:17:28+00:00","dateModified":"2025-06-14T03:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/"},"wordCount":551,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Amazon Web Services (AWS)"],"articleSection":["Couchbase Mobile","Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/","url":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/","name":"Building a photogallery app with auto tagging - Part 2","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-06-13T14:17:28+00:00","dateModified":"2025-06-14T03:40:55+00:00","description":"Echa un vistazo a los \"me gusta\" y mostrar por tagname caracter\u00edsticas de la aplicaci\u00f3n. En la Parte 1, aprendimos a almacenar y recuperar metadatos de im\u00e1genes desde y hacia un bucket de Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/build-photogallery-app-aws-rekognition-and-couchbase-part2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Build a photogallery app with auto tagging using AWS Rekognition and Couchbase \u2013 Part 2"}]},{"@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\/5f1a0ece4e644bc8c037686fbc8f3220","name":"Laura Czajkowski, Directora de la Comunidad de Desarrolladores, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g9deb07d5daaa00220534c31768bc4409","url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","caption":"Laura Czajkowski, Developer Community Manager, Couchbase"},"description":"Laura Czajkowski es la Snr. Developer Community Manager en Couchbase supervisando la comunidad. Es responsable de nuestro bolet\u00edn mensual para desarrolladores.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laura-czajkowski\/"}]}},"acf":[],"authors":[{"term_id":9026,"user_id":53,"is_guest":0,"slug":"laura-czajkowski","display_name":"Laura Czajkowski, Developer Community Manager, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bc8eebaf25cbe39bc12fd7b1ef92550becc3953ab877a3f0285a59ec2d30b754?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3721","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\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=3721"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/3721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=3721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=3721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=3721"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=3721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}