{"id":8085,"date":"2020-01-21T10:30:47","date_gmt":"2020-01-21T18:30:47","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8085"},"modified":"2024-09-12T00:46:45","modified_gmt":"2024-09-12T07:46:45","slug":"ansi-join-enhancements-and-ansi-merge","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-enhancements-and-ansi-merge\/","title":{"rendered":"Aprimoramentos do ANSI JOIN e ANSI MERGE"},"content":{"rendered":"<h2><span style=\"font-weight: 400\">Introdu\u00e7\u00e3o<\/span><\/h2>\n<p><span style=\"font-weight: 400\">O suporte do N1QL para ANSI JOIN foi introduzido pela primeira vez na vers\u00e3o 5.5. Atualmente, h\u00e1 uma restri\u00e7\u00e3o no ANSI JOIN (vers\u00e3o 5.5 e 6.0) em que o lado direito de um ANSI JOIN deve ser um espa\u00e7o-chave. Essa restri\u00e7\u00e3o ser\u00e1 eliminada na vers\u00e3o 6.5.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O suporte do N1QL para a instru\u00e7\u00e3o MERGE atualmente usa a cl\u00e1usula ON KEYS, semelhante \u00e0 jun\u00e7\u00e3o de pesquisa. A sintaxe ANSI MERGE ser\u00e1 suportada na vers\u00e3o 6.5.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Aprimoramentos do ANSI JOIN<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Na vers\u00e3o 6.5 do Couchbase Server, o N1QL adiciona suporte para express\u00e3o e subconsulta como lado direito de um ANSI JOIN. Anteriormente, nas vers\u00f5es 5.5 e 6.0, o lado direito de um ANSI JOIN deve ser um espa\u00e7o-chave. Um erro ser\u00e1 retornado se o lado direito de um ANSI JOIN n\u00e3o for um espa\u00e7o-chave.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A restri\u00e7\u00e3o para o espa\u00e7o-chave s\u00f3 existe nas vers\u00f5es 5.5 e 6.0, e s\u00f3 se aplica ao lado direito de um ANSI JOIN. O lado esquerdo de um ANSI JOIN pode ser um espa\u00e7o-chave, uma express\u00e3o, uma subconsulta ou outra opera\u00e7\u00e3o join\/nest\/unnest, desde que o ANSI JOIN n\u00e3o seja misturado com uma opera\u00e7\u00e3o join\/nest n\u00e3o ANSI.<\/span><\/p>\n<h3><span style=\"font-weight: 400\">Express\u00e3o como o lado direito de um ANSI JOIN<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Uma express\u00e3o agora pode ser usada no lado direito do ANSI JOIN. Por exemplo:<\/span><\/p>\n<pre class=\"lang:default mark:3,4 decode:true\">SELECT DISTINCT route.destinationairport\r\nFROM `travel-sample` airport JOIN\r\n  [ {\"destinationairport\": \"KEF\", \"sourceairport\": \"SFO\", \"type\": \"route\"},\r\n    {\"destinationairport\": \"KEF\", \"sourceairport\": \"LHR\", \"type\": \"route\"} ] AS route\r\n  ON airport.faa = route.sourceairport AND route.type = \"route\"\r\nWHERE airport.type = \"airport\" AND airport.city = \"San Francisco\";<\/pre>\n<p><span style=\"font-weight: 400\">Neste exemplo, uma matriz expl\u00edcita de objetos \u00e9 especificada como uma express\u00e3o no lado direito de um ANSI JOIN. Observe que quando uma express\u00e3o \u00e9 usada no lado direito de um ANSI JOIN, a express\u00e3o deve ter um alias (\"route\" no exemplo acima, embora a palavra-chave AS seja opcional).\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Quando uma express\u00e3o \u00e9 usada no lado direito de um ANSI JOIN, um operador ExpressionScan \u00e9 usado para iterar pelo conjunto de resultados da express\u00e3o no plano de explica\u00e7\u00e3o:<\/span><\/p>\n<pre class=\"lang:default mark:35-45,50-53 decode:true\">\"plan\": {\r\n    \"#operator\": \"Sequence\",\r\n    \"~children\": [\r\n        {\r\n            \"#operator\": \"IndexScan3\",\r\n            \"as\": \"airport\",\r\n            \"index\": \"ix_airport_city\",\r\n            \"index_id\": \"eee67e7e615a1b49\",\r\n            \"index_projection\": {\r\n                \"primary_key\": true\r\n            },\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\",\r\n            \"spans\": [\r\n                {\r\n                    \"exact\": true,\r\n                    \"range\": [\r\n                        {\r\n                            \"high\": \"\\\"San Francisco\\\"\",\r\n                            \"inclusion\": 3,\r\n                            \"low\": \"\\\"San Francisco\\\"\"\r\n                        }\r\n                    ]\r\n                }\r\n            ],\r\n            \"using\": \"gsi\"\r\n        },\r\n        {\r\n            \"#operator\": \"Fetch\",\r\n            \"as\": \"airport\",\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\"\r\n        },\r\n        {\r\n            \"#operator\": \"HashJoin\",\r\n            \"build_aliases\": [\r\n                \"route\"\r\n            ],\r\n            \"build_exprs\": [\r\n                \"(`route`.`sourceairport`)\"\r\n            ],\r\n            \"on_clause\": \"(((`airport`.`faa`) = (`route`.`sourceairport`)) and ((`route`.`type`) = \\\"route\\\"))\",\r\n            \"probe_exprs\": [\r\n                \"(`airport`.`faa`)\"\r\n            ],\r\n            \"~child\": {\r\n                \"#operator\": \"Sequence\",\r\n                \"~children\": [\r\n                    {\r\n                        \"#operator\": \"ExpressionScan\",\r\n                        \"alias\": \"route\",\r\n                        \"expr\": \"[{\\\"destinationairport\\\": \\\"KEF\\\", \\\"sourceairport\\\": \\\"SFO\\\", \\\"type\\\": \\\"route\\\"}, {\\\"destinationairport\\\": \\\"KEF\\\", \\\"sourceairport\\\": \\\"LHR\\\", \\\"type\\\": \\\"route\\\"}]\",\r\n                        \"uncorrelated\": true\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"#operator\": \"Parallel\",\r\n            \"~child\": {\r\n                \"#operator\": \"Sequence\",\r\n                \"~children\": [\r\n                    {\r\n                        \"#operator\": \"Filter\",\r\n                        \"condition\": \"(((`airport`.`type`) = \\\"airport\\\") and ((`airport`.`city`) = \\\"San Francisco\\\"))\"\r\n                    },\r\n                    {\r\n                        \"#operator\": \"InitialProject\",\r\n                        \"distinct\": true,\r\n                        \"result_terms\": [\r\n                            {\r\n\r\n                                \"expr\": \"(`route`.`destinationairport`)\"\r\n                            }\r\n                        ]\r\n                    },\r\n                    {\r\n                        \"#operator\": \"Distinct\"\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"#operator\": \"Distinct\"\r\n        }\r\n    ]\r\n},\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400\">Subconsulta como lado direito de um ANSI JOIN<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Uma subconsulta tamb\u00e9m pode ser usada no lado direito do ANSI JOIN. Por exemplo:<\/span><\/p>\n<pre class=\"lang:default mark:3,4 decode:true\">SELECT DISTINCT route.destinationairport\r\nFROM `travel-sample` airport JOIN\r\n ( SELECT destinationairport, sourceairport\r\n   FROM `travel-sample` WHERE type = \"route\" ) AS route\r\n ON airport.faa = route.sourceairport\r\nWHERE airport.type = \"airport\" AND airport.city = \"San Francisco\";\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Neste exemplo, uma subconsulta \u00e9 usada no lado direito de um ANSI JOIN. Semelhante a uma express\u00e3o, quando uma subconsulta \u00e9 usada no lado direito de um ANSI JOIN, a subconsulta tamb\u00e9m deve ter um alias (\"route\" no exemplo acima, embora a palavra-chave AS seja opcional).<\/span><\/p>\n<p><span style=\"font-weight: 400\">Quando uma subconsulta \u00e9 usada no lado direito de um ANSI JOIN, a explica\u00e7\u00e3o mostra o plano da pr\u00f3pria subconsulta:<\/span><\/p>\n<pre class=\"lang:default mark:35-45,48-111 decode:true\">\"plan\": {\r\n    \"#operator\": \"Sequence\",\r\n    \"~children\": [\r\n        {\r\n            \"#operator\": \"IndexScan3\",\r\n            \"as\": \"airport\",\r\n            \"index\": \"ix_airport_city\",\r\n            \"index_id\": \"eee67e7e615a1b49\",\r\n            \"index_projection\": {\r\n                \"primary_key\": true\r\n            },\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\",\r\n            \"spans\": [\r\n                {\r\n                    \"exact\": true,\r\n                    \"range\": [\r\n                        {\r\n                            \"high\": \"\\\"San Francisco\\\"\",\r\n                            \"inclusion\": 3,\r\n                            \"low\": \"\\\"San Francisco\\\"\"\r\n                        }\r\n                    ]\r\n                }\r\n            ],\r\n            \"using\": \"gsi\"\r\n        },\r\n        {\r\n            \"#operator\": \"Fetch\",\r\n            \"as\": \"airport\",\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\"\r\n        },\r\n        {\r\n            \"#operator\": \"HashJoin\",\r\n            \"build_aliases\": [\r\n                \"route\"\r\n            ],\r\n            \"build_exprs\": [\r\n                \"(`route`.`sourceairport`)\"\r\n            ],\r\n            \"on_clause\": \"((`airport`.`faa`) = (`route`.`sourceairport`))\",\r\n            \"probe_exprs\": [\r\n                \"(`airport`.`faa`)\"\r\n            ],\r\n            \"~child\": {\r\n                \"#operator\": \"Sequence\",\r\n                \"~children\": [\r\n                    {\r\n                        \"#operator\": \"Sequence\",\r\n                        \"~children\": [\r\n                            {\r\n                                \"#operator\": \"IndexScan3\",\r\n                                \"index\": \"ix_type\",\r\n                                \"index_id\": \"d925e49b3a11ae3d\",\r\n                                \"index_projection\": {\r\n                                    \"primary_key\": true\r\n                                },\r\n                                \"keyspace\": \"travel-sample\",\r\n                                \"namespace\": \"default\",\r\n                                \"spans\": [\r\n                                    {\r\n                                        \"exact\": true,\r\n                                        \"range\": [\r\n                                            {\r\n                                                \"high\": \"\\\"route\\\"\",\r\n                                                \"inclusion\": 3,\r\n                                                \"low\": \"\\\"route\\\"\"\r\n                                            }\r\n                                        ]\r\n                                    }\r\n                                ],\r\n                                \"using\": \"gsi\"\r\n                            },\r\n\r\n                            {\r\n                                \"#operator\": \"Fetch\",\r\n                                \"keyspace\": \"travel-sample\",\r\n                                \"namespace\": \"default\"\r\n                            },\r\n                            {\r\n                                \"#operator\": \"Parallel\",\r\n                                \"~child\": {\r\n                                    \"#operator\": \"Sequence\",\r\n                                    \"~children\": [\r\n                                        {\r\n                                            \"#operator\": \"Filter\",\r\n                                            \"condition\": \"((`travel-sample`.`type`) = \\\"route\\\")\"\r\n                                        },\r\n                                        {\r\n                                            \"#operator\": \"InitialProject\",\r\n                                            \"result_terms\": [\r\n                                                {\r\n                                                    \"expr\": \"(`travel-sample`.`destinationairport`)\"\r\n                                                },\r\n                                                {\r\n                                                    \"expr\": \"(`travel-sample`.`sourceairport`)\"\r\n                                                }\r\n                                            ]\r\n\r\n                                        }\r\n                                    ]\r\n                                }\r\n                            }\r\n                        ]\r\n                    },\r\n                    {\r\n                        \"#operator\": \"Alias\",\r\n                        \"as\": \"route\"\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"#operator\": \"Parallel\",\r\n            \"~child\": {\r\n                \"#operator\": \"Sequence\",\r\n                \"~children\": [\r\n                    {\r\n                        \"#operator\": \"Filter\",\r\n                        \"condition\": \"(((`airport`.`type`) = \\\"airport\\\") and ((`airport`.`city`) = \\\"San Francisco\\\"))\"\r\n                    },\r\n                    {\r\n                        \"#operator\": \"InitialProject\",\r\n\r\n                        \"distinct\": true,\r\n                        \"result_terms\": [\r\n                            {\r\n                                \"expr\": \"(`route`.`destinationairport`)\"\r\n                            }\r\n                        ]\r\n                    },\r\n                    {\r\n                        \"#operator\": \"Distinct\"\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"#operator\": \"Distinct\"\r\n        }\r\n    ]\r\n},\r\n<\/pre>\n<p>Quando uma subconsulta \u00e9 usada como lado direito de um ANSI JOIN, ela n\u00e3o pode ser uma subconsulta correlacionada. Um erro ser\u00e1 retornado se uma subconsulta correlacionada for usada no lado direito de um ANSI JOIN.<\/p>\n<h3><span style=\"font-weight: 400\">Jun\u00e7\u00e3o de hash usada quando uma express\u00e3o ou uma subconsulta est\u00e1 no lado direito de um ANSI JOIN<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Quando um espa\u00e7o-chave \u00e9 usado no lado direito de um ANSI JOIN, a jun\u00e7\u00e3o de loop aninhado \u00e9 o m\u00e9todo de jun\u00e7\u00e3o padr\u00e3o e a jun\u00e7\u00e3o de hash \u00e9 considerada quando a dica USE HASH \u00e9 especificada no espa\u00e7o-chave do lado direito. Al\u00e9m disso, um \u00edndice secund\u00e1rio apropriado no espa\u00e7o-chave \u00e9 necess\u00e1rio quando a jun\u00e7\u00e3o de loop aninhado \u00e9 usada. Por outro lado, quando uma express\u00e3o ou uma subconsulta \u00e9 usada no lado direito de um ANSI JOIN, como n\u00e3o h\u00e1 \u00edndice em uma express\u00e3o ou subconsulta, \u00e9 mais eficiente usar uma jun\u00e7\u00e3o de hash para realizar a jun\u00e7\u00e3o. Uma jun\u00e7\u00e3o de loop aninhado nesse caso \u00e9 efetivamente uma jun\u00e7\u00e3o cartesiana, j\u00e1 que o conjunto de resultados da express\u00e3o ou subconsulta precisa ser repetidamente verificado para cada documento externo. Como resultado, quando uma express\u00e3o ou subconsulta est\u00e1 no lado direito de um ANSI JOIN, a jun\u00e7\u00e3o de hash \u00e9 o m\u00e9todo de jun\u00e7\u00e3o padr\u00e3o, mesmo sem a dica USE HASH especificada. Se a jun\u00e7\u00e3o de hash n\u00e3o puder ser usada, por exemplo, se n\u00e3o houver predicado de jun\u00e7\u00e3o de igualdade, se a dica USE NL for usada ou se a edi\u00e7\u00e3o comunit\u00e1ria estiver sendo usada (a jun\u00e7\u00e3o de hash s\u00f3 est\u00e1 dispon\u00edvel na edi\u00e7\u00e3o empresarial), a jun\u00e7\u00e3o de loop aninhado ser\u00e1 considerada. Observando os arquivos de explica\u00e7\u00e3o acima para os casos de express\u00e3o e subconsulta como lado direito de um ANSI JOIN, voc\u00ea pode encontrar um operador HashJoin usado em ambos os arquivos de explica\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Quando um espa\u00e7o de chave \u00e9 usado no lado direito de um ANSI JOIN, uma dica USE INDEX ou USE KEYS pode ser especificada no espa\u00e7o de chave. Quando uma express\u00e3o ou uma subconsulta \u00e9 usada no lado direito de um ANSI JOIN, n\u00e3o \u00e9 poss\u00edvel especificar uma dica USE INDEX ou USE KEYS na express\u00e3o ou subconsulta, por motivos \u00f3bvios. A \u00fanica dica dispon\u00edvel nesse caso \u00e9 uma dica de uni\u00e3o (USE HASH ou USE NL).<\/span><\/p>\n<h3><span style=\"font-weight: 400\">Suporte para ANSI NEST<\/span><\/h3>\n<p><span style=\"font-weight: 400\">O mesmo aprimoramento tamb\u00e9m se aplica ao ANSI NEST, ou seja, agora voc\u00ea pode usar uma express\u00e3o ou uma subconsulta como o lado direito de um ANSI NEST.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">ANSI MERGE<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Uma instru\u00e7\u00e3o MERGE permite que os documentos da \"fonte\" sejam mesclados no \"destino\", ou seja, quando uma correspond\u00eancia \u00e9 encontrada, o documento de destino pode ser atualizado; quando uma correspond\u00eancia n\u00e3o \u00e9 encontrada, um documento pode ser inserido no destino.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O conceito de \"correspond\u00eancia\" \u00e9 determinado pela condi\u00e7\u00e3o de correspond\u00eancia. Nas vers\u00f5es anteriores do Couchbase, o N1QL suporta apenas uma \"correspond\u00eancia\" baseada na chave do documento, ou seja, a origem deve produzir uma chave de documento para o destino, para determinar se uma correspond\u00eancia \u00e9 encontrada (se o documento com essa chave de documento j\u00e1 existe no destino). Isso \u00e9 obtido pela cl\u00e1usula ON KEYS na sintaxe da instru\u00e7\u00e3o MERGE.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O comando MERGE com a cl\u00e1usula ON KEYS \u00e9 chamado de look-up merge. Isso \u00e9 semelhante \u00e0 sintaxe de uni\u00e3o antes do suporte a ANSI JOIN, ou seja, look-up join, que tamb\u00e9m requer uni\u00e3o na chave do documento e usa a cl\u00e1usula ON KEYS. Portanto, uma extens\u00e3o natural da instru\u00e7\u00e3o MERGE \u00e9 usar a sintaxe ANSI MERGE, ou seja, usar a cl\u00e1usula ON para especificar a condi\u00e7\u00e3o de mesclagem, de modo que uma express\u00e3o arbitr\u00e1ria possa ser usada para determinar se existe ou n\u00e3o uma correspond\u00eancia. O ANSI MERGE \u00e9 compat\u00edvel com o N1QL na vers\u00e3o 6.5 do servidor Couchbase.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Aqui est\u00e1 um exemplo de uma instru\u00e7\u00e3o ANSI MERGE:<\/span><\/p>\n<pre class=\"lang:default mark:2,3 decode:true\">MERGE INTO `travel-sample` AS route USING `travel-sample` AS airport \r\n  ON route.sourceairport = airport.faa AND airport.type = \"airport\"\r\n   AND route.type = \"route\"\r\nWHEN MATCHED THEN UPDATE SET route.old_equipment = route.equipment,\r\n                             route.equipment = \"797\", route.updated = true\r\n     WHERE route.airline = \"BA\" AND airport.country = \"France\"\r\n       AND CONTAINS(route.equipment, \"319\");\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Neste exemplo, a condi\u00e7\u00e3o de mesclagem \u00e9 especificada usando uma cl\u00e1usula ON. Isso \u00e9 muito semelhante \u00e0 cl\u00e1usula ON de um ANSI JOIN. De fato, internamente, a instru\u00e7\u00e3o ANSI MERGE usa ANSI JOIN com a mesma cl\u00e1usula ON para determinar se existe uma correspond\u00eancia para qualquer documento de origem.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A explica\u00e7\u00e3o para a declara\u00e7\u00e3o de mesclagem acima:<\/span><\/p>\n<pre class=\"lang:default mark:40-42 decode:true\">\"plan\": {\r\n    \"#operator\": \"Sequence\",\r\n    \"~children\": [\r\n        {\r\n            \"#operator\": \"IndexScan3\",\r\n            \"as\": \"airport\",\r\n            \"index\": \"ix_type\",\r\n            \"index_id\": \"d925e49b3a11ae3d\",\r\n            \"index_projection\": {\r\n                \"primary_key\": true\r\n            },\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\",\r\n            \"spans\": [\r\n                {\r\n                    \"exact\": true,\r\n                    \"range\": [\r\n                        {\r\n                            \"high\": \"\\\"airport\\\"\",\r\n                            \"inclusion\": 3,\r\n                            \"low\": \"\\\"airport\\\"\"\r\n                        }\r\n                    ]\r\n                }\r\n            ],\r\n            \"using\": \"gsi\"\r\n        },\r\n        {\r\n            \"#operator\": \"Fetch\",\r\n            \"as\": \"airport\",\r\n            \"keyspace\": \"travel-sample\",\r\n            \"namespace\": \"default\"\r\n        },\r\n        {\r\n            \"#operator\": \"Parallel\",\r\n            \"~child\": {\r\n                \"#operator\": \"Sequence\",\r\n                \"~children\": [\r\n                    {\r\n                        \"#operator\": \"NestedLoopJoin\",\r\n                        \"alias\": \"route\",\r\n                        \"on_clause\": \"((((`route`.`sourceairport`) = (`airport`.`faa`)) and ((`airport`.`type`) = \\\"airport\\\")) and ((`route`.`type`) = \\\"route\\\"))\",\r\n                        \"~child\": {\r\n                            \"#operator\": \"Sequence\",\r\n                            \"~children\": [\r\n                                {\r\n                                    \"#operator\": \"IndexScan3\",\r\n                                    \"as\": \"route\",\r\n                                    \"index\": \"ix_type\",\r\n                                    \"index_id\": \"d925e49b3a11ae3d\",\r\n                                    \"index_projection\": {\r\n                                        \"primary_key\": true\r\n                                    },\r\n                                    \"keyspace\": \"travel-sample\",\r\n                                    \"namespace\": \"default\",\r\n                                    \"nested_loop\": true,\r\n                                    \"spans\": [\r\n                                        {\r\n                                            \"exact\": true,\r\n                                            \"range\": [\r\n                                                {\r\n                                                    \"high\": \"\\\"route\\\"\",\r\n                                                    \"inclusion\": 3,\r\n                                                    \"low\": \"\\\"route\\\"\"\r\n                                                }\r\n                                            ]\r\n                                        }\r\n                                    ],\r\n                                    \"using\": \"gsi\"\r\n                                },\r\n                                {\r\n                                    \"#operator\": \"Fetch\",\r\n                                    \"as\": \"route\",\r\n                                    \"keyspace\": \"travel-sample\",\r\n                                    \"namespace\": \"default\",\r\n                                    \"nested_loop\": true\r\n                                }\r\n                            ]\r\n                        }\r\n                    },\r\n                    {\r\n                        \"#operator\": \"Merge\",\r\n                        \"as\": \"route\",\r\n                        \"keyspace\": \"travel-sample\",\r\n                        \"namespace\": \"default\",\r\n                        \"update\": {\r\n                            \"#operator\": \"Sequence\",\r\n                            \"~children\": [\r\n                                {\r\n                                    \"#operator\": \"Filter\",\r\n                                    \"condition\": \"((((`route`.`airline`) = \\\"BA\\\") and ((`airport`.`country`) = \\\"France\\\")) and contains((`route`.`equipment`), \\\"319\\\"))\"\r\n                                },\r\n                                {\r\n                                    \"#operator\": \"Clone\"\r\n                                },\r\n                                {\r\n                                    \"#operator\": \"Set\",\r\n                                    \"set_terms\": [\r\n                                        {\r\n                                            \"path\": \"(`route`.`old_equipment`)\",\r\n                                            \"value\": \"(`route`.`equipment`)\"\r\n                                        },\r\n                                        {\r\n                                            \"path\": \"(`route`.`equipment`)\",\r\n                                            \"value\": \"\\\"797\\\"\"\r\n                                        },\r\n                                        {\r\n                                            \"path\": \"(`route`.`updated`)\",\r\n                                            \"value\": \"true\"\r\n                                        }\r\n                                    ]\r\n                                },\r\n                                {\r\n                                    \"#operator\": \"SendUpdate\",\r\n                                    \"alias\": \"route\",\r\n                                    \"keyspace\": \"travel-sample\",\r\n                                    \"namespace\": \"default\"\r\n                                }\r\n                            ]\r\n                        }\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        {\r\n            \"#operator\": \"Discard\"\r\n        }\r\n    ]\r\n},\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Na explica\u00e7\u00e3o, voc\u00ea pode ver um operador NestedLoopJoin que \u00e9 usado para a opera\u00e7\u00e3o ANSI JOIN (transformada internamente) entre a origem e o destino.<\/span><\/p>\n<p>A dica de uni\u00e3o pode ser especificada na fonte:<\/p>\n<pre class=\"lang:default mark:1 decode:true\">MERGE INTO `travel-sample` AS route USING `travel-sample` AS airport USE HASH(build)\r\n  ON route.sourceairport = airport.faa AND airport.type = \"airport\"\r\n   AND route.type = \"route\"\r\nWHEN MATCHED THEN UPDATE SET route.old_equipment = route.equipment,\r\n                             route.equipment = \"797\", route.updated = true\r\n     WHERE route.airline = \"BA\" AND airport.country = \"France\"\r\n       AND CONTAINS(route.equipment, \"319\");<\/pre>\n<p>Neste exemplo, a dica USE HASH \u00e9 especificada no aeroporto.<\/p>\n<h3><span style=\"font-weight: 400\">Tratamento de v\u00e1rias correspond\u00eancias em ANSI MERGE<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Na mesclagem de pesquisa, como a condi\u00e7\u00e3o de mesclagem est\u00e1 na chave do documento, h\u00e1 apenas uma \u00fanica correspond\u00eancia de documento de destino potencial para cada documento de origem. No ANSI MERGE, como a condi\u00e7\u00e3o de mesclagem agora \u00e9 uma express\u00e3o arbitr\u00e1ria, pode haver v\u00e1rias correspond\u00eancias de documentos de destino para cada documento de origem. Para cada a\u00e7\u00e3o de mesclagem especificada, a a\u00e7\u00e3o de mesclagem s\u00f3 pode ser executada no m\u00e1ximo uma vez para cada documento de origem. No caso de v\u00e1rias correspond\u00eancias, se uma a\u00e7\u00e3o de mesclagem for tentada uma segunda vez para o mesmo documento de origem, um erro ser\u00e1 retornado (c\u00f3digo de erro 5320 ou 5330). Se esse erro for encontrado, a condi\u00e7\u00e3o de mesclagem (cl\u00e1usula ON) precisar\u00e1 ser refinada para evitar v\u00e1rias correspond\u00eancias para o mesmo documento de origem.<\/span><\/p>\n<h3><span style=\"font-weight: 400\">A\u00e7\u00e3o INSERT para ANSI MERGE<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Na mesclagem de pesquisa, se uma a\u00e7\u00e3o INSERT for especificada, somente o documento que est\u00e1 sendo inserido ser\u00e1 fornecido. Como a mesclagem de pesquisa exige uma correspond\u00eancia na chave do documento e a a\u00e7\u00e3o INSERT s\u00f3 \u00e9 acionada quando nenhuma correspond\u00eancia \u00e9 encontrada (ou seja, nenhum documento com essa chave de documento existe no destino), o documento rec\u00e9m-inserido simplesmente usar\u00e1 a mesma chave de documento. Para ANSI MERGE, isso n\u00e3o \u00e9 mais verdade, pois n\u00e3o \u00e9 mais necess\u00e1rio que uma chave de documento seja a condi\u00e7\u00e3o de correspond\u00eancia. Como resultado, quando uma a\u00e7\u00e3o INSERT \u00e9 especificada, uma chave de documento tamb\u00e9m deve ser especificada como parte da a\u00e7\u00e3o INSERT. Por exemplo:<\/span><\/p>\n<pre class=\"lang:default mark:4 decode:true\">MERGE INTO `travel-sample` AS route USING `travel-sample` AS airport \r\n  ON route.sourceairport = airport.faa AND airport.type = \"airport\"\r\n   AND route.type = \"route\"\r\nWHEN NOT MATCHED THEN INSERT (KEY UUID(), VALUE {\"sourceairport\": airport.faa, \"targetairport\": \"SFO\", \"type\": \"route\"}) \r\n     WHERE airport.country = \"France\";\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Em compara\u00e7\u00e3o, aqui est\u00e1 a sintaxe da a\u00e7\u00e3o INSERT para mesclagem de pesquisa:<\/span><\/p>\n<pre class=\"lang:default decode:true\">WHEN NOT MATCHED THEN INSERT &lt;expr&gt;<\/pre>\n<p><span style=\"font-weight: 400\">em que  \u00e9 o documento a ser inserido.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Aqui est\u00e1 a sintaxe da a\u00e7\u00e3o INSERT para ANSI MERGE:<\/span><\/p>\n<pre class=\"lang:default decode:true\">WHEN NOT MATCHED THEN INSERT (&lt;key_expr&gt;, &lt;value_expr&gt;)\r\nWHEN NOT MATCHED THEN INSERT (KEY &lt;key_expr&gt;, VALUE &lt;value_expr&gt;)<\/pre>\n<p><span style=\"font-weight: 400\">em que  especifica a chave do documento para o documento rec\u00e9m-inserido e  especifica o novo documento. Os dois s\u00e3o separados por uma v\u00edrgula.<\/span><\/p>\n<p><span style=\"font-weight: 400\">H\u00e1 duas formas que podem ser usadas, as palavras-chave KEY e VALUE s\u00e3o opcionais. Um novo par de par\u00eanteses tamb\u00e9m \u00e9 necess\u00e1rio.<\/span><\/p>\n<p><span style=\"font-weight: 400\">As outras a\u00e7\u00f5es de mesclagem (a\u00e7\u00e3o UPDATE, a\u00e7\u00e3o DELETE) permanecem as mesmas entre a mesclagem de pesquisa e a ANSI MERGE.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400\">Resumo<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Os aprimoramentos do ANSI JOIN e o suporte ao ANSI MERGE no Couchbase 6.5 aumentam a conformidade do N1QL com o ANSI e tornam o N1QL mais f\u00e1cil de usar, especialmente para a migra\u00e7\u00e3o de um banco de dados relacional.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Introduction N1QL support for ANSI JOIN was first introduced in version 5.5. Currently there is a restriction in ANSI JOIN (version 5.5 and 6.0) in that the right-hand side of an ANSI JOIN must be a keyspace. This restriction will [&hellip;]<\/p>","protected":false},"author":3021,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1812],"tags":[],"ppma_author":[9065],"class_list":["post-8085","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-n1ql-query"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ANSI JOIN Enhancements and ANSI MERGE - The Couchbase 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=\"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-enhancements-and-ansi-merge\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ANSI JOIN Enhancements and ANSI MERGE\" \/>\n<meta property=\"og:description\" content=\"Introduction N1QL support for ANSI JOIN was first introduced in version 5.5. Currently there is a restriction in ANSI JOIN (version 5.5 and 6.0) in that the right-hand side of an ANSI JOIN must be a keyspace. This restriction will [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-enhancements-and-ansi-merge\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-21T18:30:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T07:46:45+00:00\" \/>\n<meta name=\"author\" content=\"Bingjie Miao, Principal Software Engineer 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=\"Bingjie Miao, Principal Software Engineer Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/\"},\"author\":{\"name\":\"Bingjie Miao, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3a65595a167e56276aec1f708072c2e6\"},\"headline\":\"ANSI JOIN Enhancements and ANSI MERGE\",\"datePublished\":\"2020-01-21T18:30:47+00:00\",\"dateModified\":\"2024-09-12T07:46:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/\"},\"wordCount\":1457,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/\",\"name\":\"ANSI JOIN Enhancements and ANSI MERGE - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2020-01-21T18:30:47+00:00\",\"dateModified\":\"2024-09-12T07:46:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#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\/ansi-join-enhancements-and-ansi-merge\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ANSI JOIN Enhancements and ANSI MERGE\"}]},{\"@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\/3a65595a167e56276aec1f708072c2e6\",\"name\":\"Bingjie Miao, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8834c93ec327fc373f7cf1896138b95b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d0ea9ddc7d74a893baf9227b26296cccf1eed2fc94c0c94e7fb04485b7251025?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d0ea9ddc7d74a893baf9227b26296cccf1eed2fc94c0c94e7fb04485b7251025?s=96&d=mm&r=g\",\"caption\":\"Bingjie Miao, Senior Software Engineer, Couchbase\"},\"description\":\"Bingjie Miao is a principal software engineer at Couchbase. Bingjie has 20 years of experience in relational and NoSQL databases. His main area of expertise is query optimization and query execution.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/bingjie-miaocouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ANSI JOIN Enhancements and ANSI MERGE - The Couchbase 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":"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-enhancements-and-ansi-merge\/","og_locale":"pt_BR","og_type":"article","og_title":"ANSI JOIN Enhancements and ANSI MERGE","og_description":"Introduction N1QL support for ANSI JOIN was first introduced in version 5.5. Currently there is a restriction in ANSI JOIN (version 5.5 and 6.0) in that the right-hand side of an ANSI JOIN must be a keyspace. This restriction will [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-enhancements-and-ansi-merge\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-01-21T18:30:47+00:00","article_modified_time":"2024-09-12T07:46:45+00:00","author":"Bingjie Miao, Principal Software Engineer Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Bingjie Miao, Principal Software Engineer Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/"},"author":{"name":"Bingjie Miao, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3a65595a167e56276aec1f708072c2e6"},"headline":"ANSI JOIN Enhancements and ANSI MERGE","datePublished":"2020-01-21T18:30:47+00:00","dateModified":"2024-09-12T07:46:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/"},"wordCount":1457,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/","url":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/","name":"ANSI JOIN Enhancements and ANSI MERGE - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2020-01-21T18:30:47+00:00","dateModified":"2024-09-12T07:46:45+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/ansi-join-enhancements-and-ansi-merge\/#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\/ansi-join-enhancements-and-ansi-merge\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ANSI JOIN Enhancements and ANSI MERGE"}]},{"@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\/3a65595a167e56276aec1f708072c2e6","name":"Bingjie Miao, engenheiro de software s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8834c93ec327fc373f7cf1896138b95b","url":"https:\/\/secure.gravatar.com\/avatar\/d0ea9ddc7d74a893baf9227b26296cccf1eed2fc94c0c94e7fb04485b7251025?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d0ea9ddc7d74a893baf9227b26296cccf1eed2fc94c0c94e7fb04485b7251025?s=96&d=mm&r=g","caption":"Bingjie Miao, Senior Software Engineer, Couchbase"},"description":"Bingjie Miao \u00e9 engenheiro de software principal da Couchbase. Bingjie tem 20 anos de experi\u00eancia em bancos de dados relacionais e NoSQL. Sua principal \u00e1rea de especializa\u00e7\u00e3o \u00e9 a otimiza\u00e7\u00e3o e execu\u00e7\u00e3o de consultas.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/bingjie-miaocouchbase-com\/"}]}},"authors":[{"term_id":9065,"user_id":3021,"is_guest":0,"slug":"bingjie-miaocouchbase-com","display_name":"Bingjie Miao, Principal Software Engineer Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/d0ea9ddc7d74a893baf9227b26296cccf1eed2fc94c0c94e7fb04485b7251025?s=96&d=mm&r=g","author_category":"","last_name":"Miao, Principal Software Engineer, Couchbase","first_name":"Bingjie","job_title":"","user_url":"","description":"Bingjie Miao \u00e9 engenheiro de software principal da Couchbase. Bingjie tem 20 anos de experi\u00eancia em bancos de dados relacionais e NoSQL. Sua principal \u00e1rea de especializa\u00e7\u00e3o \u00e9 a otimiza\u00e7\u00e3o e execu\u00e7\u00e3o de consultas."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8085","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\/3021"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=8085"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8085\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=8085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=8085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=8085"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=8085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}