{"id":436,"date":"2013-05-03T14:14:56","date_gmt":"2013-05-03T12:14:56","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=436"},"modified":"2013-05-03T14:14:56","modified_gmt":"2013-05-03T12:14:56","slug":"mongodb-un-exemple-de-map-reduce","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/","title":{"rendered":"MongoDB : un exemple de map-reduce"},"content":{"rendered":"<p>Le concept de <strong>map-reduce<\/strong> (on lit parfois les termes de <em>paradigme de programmation<\/em> ou de <em>design pattern<\/em> associ\u00e9s \u00e0 map-reduce) n&rsquo;a rien de nouveau : il s&rsquo;inspire grandement des principes de base de la programmation fonctionnelle (i.e, par usage de fonctions math\u00e9matiques).<\/p>\n<p>Comme son nom l&rsquo;indique, <strong>map-reduce<\/strong> se compose de deux fonctions :<\/p>\n<ul>\n<li><strong>map<\/strong>, qui passe \u00e0 <em>reduce<\/em> une cl\u00e9 et des donn\u00e9es \u00e0 traiter<\/li>\n<li><strong>reduce<\/strong> qui, pour chaque cl\u00e9 donn\u00e9e par <strong>map<\/strong>, va op\u00e9rer une r\u00e9duction sur les donn\u00e9es en provenance de <strong>map<\/strong> selon une logique que vous allez devoir \u00e9crire.<\/li>\n<\/ul>\n<p><strong>Map-reduce<\/strong> a connu un renouveau avec l&rsquo;apparition des <em>data stores<\/em>\u00a0de tr\u00e8s grande capacit\u00e9 (on parle ici en\u00a0p\u00e9taoctets)\u00a0sur le web et doit en grande partie son retour sous les feux de la rampe \u00e0 Google qui s&rsquo;en est servi (et s&rsquo;en sert toujours) pour distribuer\/parall\u00e9liser les traitements, sur des <em>clusters<\/em> de machines. Le principe est simple: d\u00e9couper un gros probl\u00e8me en plusieurs petits, r\u00e9solus par distribution \u00e0 des\u00a0n\u0153uds\u00a0fils (<em>r\u00e9ducteurs<\/em>) qui ensuite remontent le r\u00e9sultat de ces op\u00e9rations aux\u00a0n\u0153uds\u00a0de niveau sup\u00e9rieur, et ce r\u00e9cursivement jusqu&rsquo;\u00e0 remonter au la racine de l&rsquo;arbre, qui a initi\u00e9 le calcul et en r\u00e9cup\u00e8re donc le r\u00e9sultat final.<\/p>\n<p>Ici nous n&rsquo;aurons par cette notion de <em>master nodes<\/em> \/ <em>worker nodes<\/em> car nous travaillons sur une seule instance de MongoDB, situ\u00e9e sur un seul serveur (ma machine) et non sur une architecture bas\u00e9e sur des <em>shards<\/em> ou des <em>replica sets<\/em>.<\/p>\n<p><div id=\"attachment_447\" style=\"width: 210px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/MongoDB_MapReduce1.png\"><img aria-describedby=\"caption-attachment-447\" loading=\"lazy\" class=\"size-full wp-image-447\" alt=\"Image provenant de http:\/\/www.pal-blog.de\/\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/MongoDB_MapReduce1.png\" width=\"200\" height=\"200\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/MongoDB_MapReduce1.png 200w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/MongoDB_MapReduce1-150x150.png 150w\" sizes=\"(max-width: 200px) 100vw, 200px\" \/><\/a><p id=\"caption-attachment-447\" class=\"wp-caption-text\">Image provenant de PAL-Blog [http:\/\/www.pal-blog.de]<\/p><\/div><br \/>\n<strong>Map<\/strong> traverse tous les documents de votre collection MongoDB et va pousser des infos \u00e0 <strong>reduce<\/strong> selon une cl\u00e9 d\u00e9finie. Passons \u00e0 la pratique sans plus tarder&#8230;<\/p>\n<h1>Notre collection de test<\/h1>\n<p>Nous allons constituer une collection d\u00e9nomm\u00e9e <strong>commandes<\/strong> et qui va contenir les commandes pass\u00e9es sur notre site web. Ces commandes seront \u00e9videmment des documents dont la structure est la suivante :<\/p>\n<ul>\n<li>userid : l&rsquo;identifiant de l&rsquo;utilisateur \u00e0 l&rsquo;origine de la commande<\/li>\n<li>date : la date de passage (ou de validation, pourquoi pas) de la commande<\/li>\n<li>codepost : le code postal de la ville de r\u00e9sidence de l&rsquo;utilisateur<\/li>\n<li>articles : la liste des articles command\u00e9s (il y en a autant que souhait\u00e9)<\/li>\n<li>totalttc : le prix TTC de la totalit\u00e9 de la commande<\/li>\n<li>totalht : le prix HT de la totalit\u00e9 de la commande<\/li>\n<li>tva : le montant de TVA applicable \u00e0 la commande<\/li>\n<\/ul>\n<pre>sebastien.ferrandez@sebastien:~$ <strong>mongo<\/strong>\r\n MongoDB shell version: 2.0.6\r\n connecting to: test\r\n&gt;<strong>db.createCollection('commandes');<\/strong>\r\n { \"ok\" : 1 }\r\n&gt;<strong>show collections;<\/strong>\r\n commandes\r\n system.indexes\r\n\r\n&gt;db.commandes.insert({userid: 54845, date: new Date(\"Apr 28, 2013\"), codepost:13100, articles:[{id:1,nom:'livre',prix:29.90}, {id:9, nom:'eponge', prix:2.90}], totalttc:32.80, tva:5.38, totalht:27.42});\r\n\r\n&gt;db.commandes.insert({userid: 54846, date: new Date(\"Apr 29, 2013\"),codepost:13290, articles:[{id:45,nom:'robinet',prix:69.90}, {id:9, nom:'laitx6', prix:9.90}], totalttc:79.80, tva:13.08, totalht:66.72});\r\n\r\n&gt;db.commandes.insert({userid: 54847, date: new Date(\"Apr 30, 2013\"),codepost:13008, articles:[{id:76,nom:'clavier',prix:49.90}, {id:2, nom:'fromage', prix:1.50}], totalttc:51.40, tva:8.42, totalht:42.98});\r\n\r\n&gt;db.commandes.insert({userid: 54848, date: new Date(\"Apr 28, 2013\"),codepost:13600, articles:[{id:2987,nom:'presse',prix:2}], totalttc:2, tva:0.33, totalht:1.67});\r\n\r\n&gt;db.commandes.insert({userid: 54848, date: new Date(\"Apr 29, 2013\"),codepost:13600, articles:[{id:2988,nom:'presse',prix:5.90}], totalttc:5.90, tva:0.97, totalht:4.93});\r\n\r\n&gt;db.commandes.insert({userid: 54848, date: new Date(\"Apr 30, 2013\"),codepost:13600, articles:[{id:3989,nom:'presse',prix:1.20}], totalttc:1.20, tva:0.20, totalht:1});\r\n\r\n&gt;db.commandes.insert({userid: 54847, date: new Date(\"Apr 25, 2013\"),codepost:13008, articles:[{id:2987,nom:'presse',prix:2}], totalttc:2, tva:0.33, totalht:1.67});<\/pre>\n<h1>Structure du JSON<\/h1>\n<p>Voici la structure de l&rsquo;un de nos documents :<\/p>\n<pre>{\r\n    \"_id\": ObjectId(\"517fb463b53bb7169584f3c7\"),\r\n    \"userid\": 54847,\r\n    \"date\": ISODate(\"2013-04-29T22:00:00Z\"),\r\n    \"codepost\": 13008,\r\n    \"articles\": [\r\n        {\r\n            \"id\": 76,\r\n            \"nom\": \"clavier\",\r\n            \"prix\": 49.9\r\n        },\r\n        {\r\n            \"id\": 2,\r\n            \"nom\": \"fromage\",\r\n            \"prix\": 1.5\r\n        }\r\n    ],\r\n    \"totalttc\": 51.4,\r\n    \"tva\": 8.42,\r\n    \"totalht\": 42.98\r\n}<\/pre>\n<h1>Le JavaScript de notre map-reduce<\/h1>\n<p>Maintenant, nous allons \u00e9crire le map-reduce qui va op\u00e9rer sur ces donn\u00e9es; notre but est d&rsquo;afficher, par code postal, le chiffre d&rsquo;affaire g\u00e9n\u00e9r\u00e9 par notre site en ligne. Cr\u00e9ons donc un fichier <strong>mapred.js<\/strong> qui contiendra notre MR :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nuse commandes;\r\n\r\nmap = function() {\r\n\temit(this['codepost'], {totalttc: this['totalttc']});\r\n\t};\r\n\r\nreduce = function(cle, valeur) {\r\n\t\t\tvar s = {somme : 0};\r\n\t\t\tvaleur.forEach(function(article) {\r\n\t\t\t\ts.somme += article.totalttc;\r\n\t\t\t});\r\n\t\t\treturn s;\r\n\t\t};\r\n\r\ndb.commandes.mapReduce(map, reduce, {out:'total_cmdes_par_ville'});\r\n\r\ndb.total_cmdes_par_ville.find();\r\n<\/pre>\n<h1>And&#8230;action !<\/h1>\n<p>Nous injectons notre fichier JS dans Mongo<\/p>\n<pre>sebastien.ferrandez@sebastien:~$ <strong>mongo &lt; \/tmp\/mapred.js<\/strong><\/pre>\n<p>Et voici le r\u00e9sultat produit :<\/p>\n<pre>MongoDB shell version: 2.0.6\r\nconnecting to: test\r\nfunction () {\r\n    emit(this.codepost, {totalttc:this.totalttc});\r\n}\r\nfunction (cle, valeur) {\r\n    var s = {somme:0};\r\n    valeur.forEach(function (article) {s.somme += article.totalttc;});\r\n    return s;\r\n}\r\n{\r\n        \"result\" : \"total_cmdes_par_ville\",\r\n        \"timeMillis\" : 33,\r\n        \"counts\" : {\r\n                \"input\" : 7,\r\n                \"emit\" : 7,\r\n                \"reduce\" : 2,\r\n                \"output\" : 4\r\n        },\r\n        \"ok\" : 1,\r\n}\r\n<strong>{ \"_id\" : 13008, \"value\" : { \"somme\" : 53.4 } }\r\n{ \"_id\" : 13100, \"value\" : { \"totalttc\" : 32.8 } }\r\n{ \"_id\" : 13290, \"value\" : { \"totalttc\" : 79.8 } }\r\n{ \"_id\" : 13600, \"value\" : { \"somme\" : 9.1 } }<\/strong>\r\nbye<\/pre>\n<p>La fonction <strong>map<\/strong> va \u00e9mettre (<em>emit<\/em>) des paires cl\u00e9\/valeur sur lesquelles <strong>reduce<\/strong> va travailler. Pour faire simple, <strong>reduce<\/strong> va faire la somme de tous les montants TTC des commandes pour un code postal donn\u00e9. Une collection est cr\u00e9\u00e9e pour abriter le r\u00e9sultat de l&rsquo;ex\u00e9cution de map-reduce : nous avons d\u00e9cider de la nommer <strong>total_cmdes_par_ville<\/strong>. Elle est persistante, elle ne sera pas d\u00e9truite une fois que vous vous d\u00e9connectez du shell MongoDB.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le concept de map-reduce (on lit parfois les termes de paradigme de programmation ou de design pattern associ\u00e9s \u00e0 map-reduce) n&rsquo;a rien de nouveau : il s&rsquo;inspire grandement des principes de base de la programmation fonctionnelle (i.e, par usage de fonctions math\u00e9matiques). Comme son nom l&rsquo;indique, map-reduce se compose de deux fonctions : map, qui [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[26,46],"tags":[51,50,52],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MongoDB : un exemple de map-reduce - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB : un exemple de map-reduce - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Le concept de map-reduce (on lit parfois les termes de paradigme de programmation ou de design pattern associ\u00e9s \u00e0 map-reduce) n&rsquo;a rien de nouveau : il s&rsquo;inspire grandement des principes de base de la programmation fonctionnelle (i.e, par usage de fonctions math\u00e9matiques). Comme son nom l&rsquo;indique, map-reduce se compose de deux fonctions : map, qui [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-05-03T12:14:56+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/MongoDB_MapReduce1.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/\",\"name\":\"MongoDB : un exemple de map-reduce - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-05-03T12:14:56+00:00\",\"dateModified\":\"2013-05-03T12:14:56+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MongoDB : un exemple de map-reduce\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MongoDB : un exemple de map-reduce - La Fabrique de code - Tech blog","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":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/","og_locale":"fr_FR","og_type":"article","og_title":"MongoDB : un exemple de map-reduce - La Fabrique de code - Tech blog","og_description":"Le concept de map-reduce (on lit parfois les termes de paradigme de programmation ou de design pattern associ\u00e9s \u00e0 map-reduce) n&rsquo;a rien de nouveau : il s&rsquo;inspire grandement des principes de base de la programmation fonctionnelle (i.e, par usage de fonctions math\u00e9matiques). Comme son nom l&rsquo;indique, map-reduce se compose de deux fonctions : map, qui [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-05-03T12:14:56+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/04\/MongoDB_MapReduce1.png"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/","name":"MongoDB : un exemple de map-reduce - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-05-03T12:14:56+00:00","dateModified":"2013-05-03T12:14:56+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/mongodb-un-exemple-de-map-reduce\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MongoDB : un exemple de map-reduce"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/436"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=436"}],"version-history":[{"count":26,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/436\/revisions"}],"predecessor-version":[{"id":463,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/436\/revisions\/463"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=436"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}