{"id":17545,"date":"2025-09-10T14:28:56","date_gmt":"2025-09-10T21:28:56","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17545"},"modified":"2025-09-10T14:28:56","modified_gmt":"2025-09-10T21:28:56","slug":"clone-couchbase-clusters","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/clone-couchbase-clusters\/","title":{"rendered":"Como clonar clusters do Couchbase para ambientes ef\u00eameros sob demanda de CI\/CD"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Continuous Integration and Continuous Deployment are now common software development practices. In the world of databases, this translates into needing on-demand, stateful, ephemeral environments.\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Provisioning a stateless environment is not tied to any particular source of data. All that is needed is to run the code you want to test in your CI environment. This is the basis of most CI\/CD tools and won\u2019t be covered in this article.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The slightly harder part comes from the dependencies the application needs to be tested properly, which is often referred to as external services. Couchbase being one of them. There are different ways to get those, through Docker containers for instance, or hosted in your test infrastructure, or some external as a Service solution. It does not really matter as long as they are available while running your test. Good practices would be to use Environment Variables to refer to those instances.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Assuming these services are running, like a Couchbase Free Tier instance or a Docker container, the next step is to make sure that they are configured correctly, and seeded with the data needed for the test.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A while ago, I posted about using <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/automate-couchbase-tests-github-actions\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Couchbase Shell in GitHub actions<\/span><\/a><span style=\"font-weight: 400;\">. This will tell you the basics about using Couchbase Shell with GitHub Actions, but this can be applied to most CI\/CD solutions as well. Today, I want to go further and show you some useful scripts to clone a cluster or elements of a cluster for your on demand environments.<\/span><\/p>\n<h2 style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Using Couchbase Shell to clone environments<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">When using Couchbase Shell, the first thing that comes to mind when wanting to do something is, is there a function for that? As of now we don\u2019t have a function to clone something. Most of the available functions reflect our APIs capabilities and we have no cloning APIs today. But, we have the ability to write scripts, which means we can make our own!<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The first thing that comes to mind when managing databases is often to recreate the structure and schemas. As Couchbase is Schemaless, this will only consist of the existing buckets, scopes, collections, and indexes in the source cluster. The first step is to export that structure so it can be reimported later. This function will list every bucket, then inner scopes and collections, and add them to an array. Then it will list all indexes and add them to the output JSON.\u00a0<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\"># Exports all buckets, scopes, collections and indexes\r\n# for the given cluster\r\ndef export-cluster-struct [\r\n\u00a0\u00a0\u00a0\u00a0source: string # The cluster to export\r\n] {\r\n\u00a0\u00a0\u00a0\u00a0mut export = []\r\n \u00a0\u00a0\u00a0let buckets = buckets\u00a0 --clusters $source # List the buckets of the given cluster\r\n\u00a0\u00a0\u00a0\u00a0for bucket in $buckets {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mut scope_structs = []\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let scopes = scopes --clusters $source --bucket $bucket.name\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for scope in $scopes {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let collections = (collections --clusters $source --bucket $bucket.name --scope $scope.scope | reject -i cluster)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$scope_structs ++= [{\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0scope: $scope.scope,\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0collections: $collections\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0# Merge the scopes with the bucket object and add it to the export array\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let buc = ( $bucket | merge {scopes: $scope_structs } )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$export ++= [ $buc ]\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0let indexes = query indexes --definitions --disable-context --clusters $source\r\n\u00a0\u00a0\u00a0\u00a0let output = {\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0buckets: $export,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0indexes: $indexes\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0return $output\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">This works because under the hood, Couchbase Shell is using Nushell, a new type of shell that is portable (meaning it works the same way on Linux, Windows, or OS X, which is great for CI\/CD scripts having to support different OS), and that considers any structure data as a DataFrame, making the manipulation of JSON extremely easy.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To try it out, run <\/span><i><span style=\"font-weight: 400;\">cbsh<\/span><\/i><span style=\"font-weight: 400;\">, then source the file containing the function. For me it\u2019s <\/span><i><span style=\"font-weight: 400;\">ci_scripts.nu<\/span><\/i><span style=\"font-weight: 400;\">. I have a cluster already configured in my cbsh config, called <\/span><i><span style=\"font-weight: 400;\">local<\/span><\/i><\/p>\n<pre class=\"nums:false lang:default decode:true\">Laurent Doguin at local in travel-sample.inventory._default\r\n&gt; source ci-scripts.nu\r\nLaurent Doguin at local in travel-sample.inventory._default\r\n&gt; export-cluster-struct local | save local-cluster-export.json\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Now if you open <\/span><i><span style=\"font-weight: 400;\">local-cluster-export.json<\/span><\/i><span style=\"font-weight: 400;\">, you will get the structure of your cluster:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">{\r\n\u00a0\u00a0\"buckets\": [\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"couchbase\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"min_durability_level\": \"none\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ram_quota\": 209715200,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"flush_enabled\": false,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cloud\": false,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scopes\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airline\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"route\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"landmark\",\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"hotel\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"tenant_agent_00\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"users\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"bookings\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"tenant_agent_01\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"users\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"bookings\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"tenant_agent_02\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"users\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"bookings\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"tenant_agent_03\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"users\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"bookings\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"tenant_agent_04\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"users\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"bookings\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"inherited\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_system\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collections\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_query\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_mobile\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"max_expiry\": \"\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0],\r\n\u00a0\u00a0\"indexes\": [\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_system\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_query\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"#primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `#primary` ON `travel-sample`.`_system`.`_query`\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_airportname\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_airportname` ON `travel-sample`(`airportname`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_city\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_city` ON `travel-sample`(`city`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_faa\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_faa` ON `travel-sample`(`faa`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_icao\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_icao` ON `travel-sample`(`icao`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airline\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_airline_primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `def_inventory_airline_primary` ON `travel-sample`.`inventory`.`airline` WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_airport_airportname\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_airport_airportname` ON `travel-sample`.`inventory`.`airport`(`airportname`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_airport_city\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_airport_city` ON `travel-sample`.`inventory`.`airport`(`city`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_airport_faa\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_airport_faa` ON `travel-sample`.`inventory`.`airport`(`faa`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"airport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_airport_primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `def_inventory_airport_primary` ON `travel-sample`.`inventory`.`airport` WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0 \u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"hotel\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_hotel_city\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_hotel_city` ON `travel-sample`.`inventory`.`hotel`(`city`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"hotel\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_hotel_primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `def_inventory_hotel_primary` ON `travel-sample`.`inventory`.`hotel` WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"landmark\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_landmark_city\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_landmark_city` ON `travel-sample`.`inventory`.`landmark`(`city`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"landmark\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_landmark_primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `def_inventory_landmark_primary` ON `travel-sample`.`inventory`.`landmark` WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"route\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_route_primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `def_inventory_route_primary` ON `travel-sample`.`inventory`.`route` WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"route\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_route_route_src_dst_day\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_route_route_src_dst_day` ON `travel-sample`.`inventory`.`route`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"route\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_route_schedule_utc\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_route_schedule_utc` ON `travel-sample`.`inventory`.`route`(array (`s`.`utc`) for `s` in `schedule` end) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"inventory\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"route\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_inventory_route_sourceairport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_inventory_route_sourceairport` ON `travel-sample`.`inventory`.`route`(`sourceairport`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_name_type\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_name_type` ON `travel-sample`(`name`) WHERE (`_type` = \\\"User\\\") WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_primary\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE PRIMARY INDEX `def_primary` ON `travel-sample` WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_route_src_dst_day\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_route_src_dst_day` ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = \\\"route\\\") WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_schedule_utc\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_schedule_utc` ON `travel-sample`(array (`s`.`utc`) for `s` in `schedule` end) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_sourceairport\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_sourceairport` ON `travel-sample`(`sourceairport`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"bucket\": \"travel-sample\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"scope\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"collection\": \"_default\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"def_type\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"status\": \"Ready\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"storage_mode\": \"memory_optimized\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"replicas\": 0,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"definition\": \"CREATE INDEX `def_type` ON `travel-sample`(`type`) WITH {\u00a0 \\\"defer_build\\\":true }\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cluster\": \"local\"\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0]\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">I have deleted that bucket for the purpose of this test, to reimport it later: <\/span><i><span style=\"font-weight: 400;\">buckets drop travel-sample<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The next logical step is to have a function that takes this file as input and recreate the complete structure in another cluster:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\"># Import all buckets, scopes and collections structure\r\n# in the given cluster\r\ndef import-cluster-struct [\r\n\u00a0\u00a0\u00a0\u00a0destination: string # The cluster to import\r\n] {\r\n\u00a0\u00a0\u00a0\u00a0let structure = $in # Assigning the piped structure to a variable\r\n\u00a0\u00a0\u00a0\u00a0let buckets = $structure.buckets\r\n\u00a0\u00a0\u00a0\u00a0for bucket in $buckets {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$bucket | _create-bucket-definition $destination\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for scope in ($bucket.scopes | where not ( $it.scope | str starts-with \"_\" ) ) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print $\"Create scope ($destination)_($bucket.name)_($scope.scope)\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0scopes create --clusters $destination --bucket $bucket.name $scope.scope\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for col in $scope.collections {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print $\"Create collection ($destination)_($bucket.name)_($scope.scope)_($col.collection)\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0collections create --clusters $destination --bucket $bucket.name --scope\u00a0 $scope.scope $col.collection\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0let indexes = $structure.indexes\r\n\u00a0\u00a0\u00a0\u00a0$indexes | _create-indexes $destination # Nushell allows you to use other functions you created\r\n}\r\n\r\ndef _create-indexes [\r\n\u00a0\u00a0\u00a0\u00a0destination: string # the cluster where to create indexes\r\n] {\r\n\u00a0\u00a0\u00a0\u00a0let indexes = $in\r\n\u00a0\u00a0\u00a0\u00a0for index in $indexes {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print $\"Recreating index ($index.name) on cluster ($destination) with: \"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print $index.definition\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query $index.definition --disable-context --clusters $destination\r\n\u00a0\u00a0\u00a0\u00a0}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Now to run that function:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">Laurent Doguin at local in travel-sample.inventory._default\r\n&gt; open local-cluster-export.json | import-cluster-struct capella\r\nLaurent Doguin at local in travel-sample.inventory._default\r\n&gt; open local-cluster-export.json | import-cluster-struct local\r\nCreate Bucket local_travel-sample with 200 quota, type couchbase, 0 replicas, none durability, 0 expiry\r\nCreate scope local_travel-sample_inventory\r\nCreate collection local_travel-sample_inventory_airport\r\nCreate collection local_travel-sample_inventory_airline\r\nCreate collection local_travel-sample_inventory_route\r\nCreate collection local_travel-sample_inventory_landmark\r\nCreate collection local_travel-sample_inventory_hotel\r\nCreate scope local_travel-sample_tenant_agent_00\r\nCreate collection local_travel-sample_tenant_agent_00_users\r\nCreate collection local_travel-sample_tenant_agent_00_bookings\r\nCreate scope local_travel-sample_tenant_agent_01\r\nCreate collection local_travel-sample_tenant_agent_01_users\r\nCreate collection local_travel-sample_tenant_agent_01_bookings\r\nCreate scope local_travel-sample_tenant_agent_02\r\nCreate collection local_travel-sample_tenant_agent_02_users\r\nCreate collection local_travel-sample_tenant_agent_02_bookings\r\nCreate scope local_travel-sample_tenant_agent_03\r\nCreate collection local_travel-sample_tenant_agent_03_users\r\nCreate collection local_travel-sample_tenant_agent_03_bookings\r\nCreate scope local_travel-sample_tenant_agent_04\r\nCreate collection local_travel-sample_tenant_agent_04_users\r\nCreate collection local_travel-sample_tenant_agent_04_bookings\r\nRecreating index #primary on cluster local with:\u00a0\r\nCREATE PRIMARY INDEX `#primary` ON `travel-sample`.`_system`.`_query`\r\nRecreating index def_airportname on cluster local with:\r\nCREATE INDEX `def_airportname` ON `travel-sample`(`airportname`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_city on cluster local with:\r\nCREATE INDEX `def_city` ON `travel-sample`(`city`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_faa on cluster local with:\r\nCREATE INDEX `def_faa` ON `travel-sample`(`faa`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_icao on cluster local with:\r\nCREATE INDEX `def_icao` ON `travel-sample`(`icao`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_airline_primary on cluster local with:\r\nCREATE PRIMARY INDEX `def_inventory_airline_primary` ON `travel-sample`.`inventory`.`airline` WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_airport_airportname on cluster local with:\r\nCREATE INDEX `def_inventory_airport_airportname` ON `travel-sample`.`inventory`.`airport`(`airportname`) WITH {\u00a0 \"defer_build\":true }Recreating index def_inventory_airport_city on cluster local with:\r\nCREATE INDEX `def_inventory_airport_city` ON `travel-sample`.`inventory`.`airport`(`city`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_airport_faa on cluster local with:\r\nCREATE INDEX `def_inventory_airport_faa` ON `travel-sample`.`inventory`.`airport`(`faa`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_airport_primary on cluster local with:\u00a0\r\nCREATE PRIMARY INDEX `def_inventory_airport_primary` ON `travel-sample`.`inventory`.`airport` WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_hotel_city on cluster local with:\u00a0\r\nCREATE INDEX `def_inventory_hotel_city` ON `travel-sample`.`inventory`.`hotel`(`city`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_hotel_primary on cluster local with:\u00a0\r\nCREATE PRIMARY INDEX `def_inventory_hotel_primary` ON `travel-sample`.`inventory`.`hotel` WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_landmark_city on cluster local with:\u00a0\r\nCREATE INDEX `def_inventory_landmark_city` ON `travel-sample`.`inventory`.`landmark`(`city`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_landmark_primary on cluster local with:\u00a0\r\nCREATE PRIMARY INDEX `def_inventory_landmark_primary` ON `travel-sample`.`inventory`.`landmark` WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_route_primary on cluster local with:\u00a0\r\nCREATE PRIMARY INDEX `def_inventory_route_primary` ON `travel-sample`.`inventory`.`route` WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_route_route_src_dst_day on cluster local with:\u00a0\r\nCREATE INDEX `def_inventory_route_route_src_dst_day` ON `travel-sample`.`inventory`.`route`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_route_schedule_utc on cluster local with:\u00a0\r\nCREATE INDEX `def_inventory_route_schedule_utc` ON `travel-sample`.`inventory`.`route`(array (`s`.`utc`) for `s` in `schedule` end) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_inventory_route_sourceairport on cluster local with:\u00a0\r\nCREATE INDEX `def_inventory_route_sourceairport` ON `travel-sample`.`inventory`.`route`(`sourceairport`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_name_type on cluster local with:\u00a0\r\nCREATE INDEX `def_name_type` ON `travel-sample`(`name`) WHERE (`_type` = \"User\") WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_primary on cluster local with:\u00a0\r\nCREATE PRIMARY INDEX `def_primary` ON `travel-sample` WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_route_src_dst_day on cluster local with:\u00a0\r\nCREATE INDEX `def_route_src_dst_day` ON `travel-sample`(`sourceairport`,`destinationairport`,(distinct (array (`v`.`day`) for `v` in `schedule` end))) WHERE (`type` = \"route\") WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_schedule_utc on cluster local with:\u00a0\r\nCREATE INDEX `def_schedule_utc` ON `travel-sample`(array (`s`.`utc`) for `s` in `schedule` end) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_sourceairport on cluster local with:\u00a0\r\nCREATE INDEX `def_sourceairport` ON `travel-sample`(`sourceairport`) WITH {\u00a0 \"defer_build\":true }\r\nRecreating index def_type on cluster local with:\u00a0\r\nCREATE INDEX `def_type` ON `travel-sample`(`type`) WITH {\u00a0 \"defer_build\":true }<\/pre>\n<p><span style=\"font-weight: 400;\">And there you have it, functions that allow you to export and import the data structure from one cluster to another. While this is a good starting point, there are still questions about how to reimport data, or about granularity. Also, you may not want to export and import a complete cluster.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Filtering buckets to import is fairly easy as Nushell allows you to filter dataframes:<\/span><\/p>\n<pre class=\"nums:false wrap:true lang:default decode:true\">Laurent Doguin at local in travel-sample.inventory._default\r\n&gt; open local-cluster-export.json | { buckets: ( $in.buckets | where name == 'travel-sample'), indexes :( $in.indexes | where bucket == 'travel-sample') }<\/pre>\n<p><span style=\"font-weight: 400;\">This will recreate a JSON object containing only a bucket named <\/span><i><span style=\"font-weight: 400;\">amostra de viagem<\/span><\/i><span style=\"font-weight: 400;\"> and indexes for this bucket.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">From there you should be all set to manage basic cluster structure. What about the data? There are different ways you can import data with cbsh, as it covers most key\/value operations as well as any INSERT\/UPSERT queries. And then we have the <\/span><a href=\"https:\/\/couchbase.sh\/docs\/#_doc_import\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\"><em>importa\u00e7\u00e3o de documentos<\/em>\u00a0comando<\/span><\/a><span style=\"font-weight: 400;\">. Its usage is fairly straightforward, all you need is a list of rows with an identified id field. This can be anything that can be turned into a dataframe for Nushell (XML, CSV, TSV, Parquet, and more). And of course, it can be a JSON file from a Couchbase SQL++ query. This is an example that will save a query result to a file and import that file back to a collection:\u00a0<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\"># Save file content to filename\r\nlet filename = $\"temp_($src_bucket)_($src_scope)_($src_collection).json\"\r\nlet query = \"SELECT meta().id as meta_id, meta().expiration as expiration, c.* FROM `\" + $src_bucket + \"`.\" + $src_scope + \".\" + $src_collection + \" c\"\r\nquery --disable-context --clusters $p.src $query | save -f $filename\r\n\r\n# Import the file content and print the results\r\nprint $\"Import collection content from ($src)_($src_bucket)_($src_scope)_($src_collection) to ($dest)_($dest_bucket)_($dest_scope)_($dest_collection)\"\r\nprint ( doc import --bucket $p.dest_bucket --scope $p.dest_scope --collection $p.dest_collection --clusters $p.dest --id-column meta_id $filename )<\/pre>\n<hr \/>\n<p><span style=\"font-weight: 400;\">That\u2019s one particular example but the whole point of using scripting language is to make them your own. You will find a more complete example in <\/span><a href=\"https:\/\/gist.github.com\/ldoguin\/3056802101cb6fafd13a9d45c150a08a\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">this GitHub Gist<\/span><\/a><span style=\"font-weight: 400;\">. It has support for environment variables for source and destination and you can decide to either clone all buckets of a cluster, a specific bucket, scope, or collection.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Don\u2019t hesitate to drop us a comment here or on <\/span><a href=\"https:\/\/discord.gg\/jK4SRkHj\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Disc\u00f3rdia<\/span><\/a><span style=\"font-weight: 400;\">, we are always looking for suggestions to improve the global Couchbase experience.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Continuous Integration and Continuous Deployment are now common software development practices. In the world of databases, this translates into needing on-demand, stateful, ephemeral environments.\u00a0\u00a0 Provisioning a stateless environment is not tied to any particular source of data. All that is [&hellip;]<\/p>","protected":false},"author":49,"featured_media":17546,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816],"tags":[9405],"ppma_author":[9023],"class_list":["post-17545","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","tag-database-migration"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"We share scripts and a practical approach to clone all buckets of a cluster, a specific bucket, scope, or collection, from one Couchbase cluster to another.\" \/>\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\/clone-couchbase-clusters\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments\" \/>\n<meta property=\"og:description\" content=\"We share scripts and a practical approach to clone all buckets of a cluster, a specific bucket, scope, or collection, from one Couchbase cluster to another.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/clone-couchbase-clusters\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-10T21:28:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments\",\"datePublished\":\"2025-09-10T21:28:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/\"},\"wordCount\":852,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png\",\"keywords\":[\"database migration\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/\",\"name\":\"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png\",\"datePublished\":\"2025-09-10T21:28:56+00:00\",\"description\":\"We share scripts and a practical approach to clone all buckets of a cluster, a specific bucket, scope, or collection, from one Couchbase cluster to another.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments\"}]},{\"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments - The Couchbase Blog","description":"We share scripts and a practical approach to clone all buckets of a cluster, a specific bucket, scope, or collection, from one Couchbase cluster to another.","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\/clone-couchbase-clusters\/","og_locale":"pt_BR","og_type":"article","og_title":"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments","og_description":"We share scripts and a practical approach to clone all buckets of a cluster, a specific bucket, scope, or collection, from one Couchbase cluster to another.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/clone-couchbase-clusters\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-09-10T21:28:56+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments","datePublished":"2025-09-10T21:28:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/"},"wordCount":852,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png","keywords":["database migration"],"articleSection":["Best Practices and Tutorials","Couchbase Server"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/","url":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/","name":"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png","datePublished":"2025-09-10T21:28:56+00:00","description":"We share scripts and a practical approach to clone all buckets of a cluster, a specific bucket, scope, or collection, from one Couchbase cluster to another.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/09\/blog-cloning-couchbase-clusters.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/clone-couchbase-clusters\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Clone Couchbase Clusters for CI\/CD On-Demand Ephemeral Environments"}]},{"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/17545","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\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=17545"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/17545\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/17546"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=17545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=17545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=17545"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=17545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}