{"id":5584,"date":"2018-08-09T10:08:54","date_gmt":"2018-08-09T17:08:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5584"},"modified":"2019-01-02T05:45:56","modified_gmt":"2019-01-02T13:45:56","slug":"10-other-things-that-developers-must-know-about-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/","title":{"rendered":"10 other things that developers must know about Couchbase"},"content":{"rendered":"<p>Couchbase Server 5.0 and 5.5 were two big releases. Let\u2019s see some of the new cool and old features which developers can\u2019t miss out:<\/p>\n<h2><strong>1) Sub Documents<\/strong><\/h2>\n<p>This feature has been here for a while, but it\u2019s still worth to mention. Some Key-Value stores only allow you to bring the whole document all-together, which is a reasonable characteristic. After all, it is a Key-Value Store. However, if you are using Couchbase as a KV, you can still manipulate parts of the document by specifying the path to it. Ex:<\/p>\n<p>Given the following document:<\/p>\n<pre class=\"lang:js decode:true \">{\r\n  \"name\": \"Douglas Reynholm\",\r\n  \"email\": \"douglas@reynholmindustries.com\",\r\n  \"addresses\": {\r\n    \"billing\": {\r\n      \"line1\": \"123 Any Street\",\r\n      \"line2\": \"Anytown\",\r\n      \"country\": \"United Kingdom\"\r\n    },\r\n    \"delivery\": {\r\n      \"line1\": \"123 Any Street\",\r\n      \"line2\": \"Anytown\",\r\n      \"country\": \"United Kingdom\"\r\n    }\r\n  },\r\n  \"purchases\": {\r\n    \"complete\": [\r\n      339, 976, 442, 666\r\n    ],\r\n    \"abandoned\": [\r\n      157, 42, 999\r\n    ]\r\n  }\r\n}<\/pre>\n<p>You can manipulate parts of the document by simply specifying the path to it, like <strong>GET(&#8216;addresses.billing&#8217;)<\/strong>\u00a0or <strong>ARRAY_APPEND(&#8216;purchases.abandoned&#8217;, 42)<\/strong><\/p>\n<p>If you want to read more, check out this <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/subdocument-operations.html\">blog post<\/a> or our <a href=\"https:\/\/www.couchbase.com\/blog\/subdoc-explained\/\">official documentation<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2>2)Eventing<\/h2>\n<p>Eventing is clearly one of the coolest features in Couchbase 5.5 and we already have a bunch of blog posts covering it, like <a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-eventing-functions\/\">here<\/a> or <a href=\"https:\/\/www.couchbase.com\/blog\/detect-sensitive-information-nosql-documents-automatically-couchbase-functions\/\">here<\/a>. For those who haven\u2019t heard it yet, the Eventing Service enables you to write\u00a0<strong>server-side functions<\/strong>\u00a0that are automatically triggered\u00a0whenever a document is inserted\/updated\/deleted. Those functions can be easily written using a JavaScript-like syntax:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5585\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/eventing.png\" alt=\"\" width=\"544\" height=\"322\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/eventing.png 716w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/eventing-300x178.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/eventing-20x12.png 20w\" sizes=\"auto, (max-width: 544px) 100vw, 544px\" \/><\/p>\n<p>Additionally, you can also call endpoints in your application via curl:<\/p>\n<pre class=\"lang:js decode:true \">function OnUpdate(doc, meta) {\r\n  if (doc.resourceType != 'Observation') return;\r\n \r\n  let reference = doc.subject.reference;\r\n  let url = \"https:\/\/localhost:8080\/events\/\" + reference.substr(9);\r\n  let data = JSON.stringify({\r\n    \"reference\": doc.subject.reference,\r\n    \"code\": doc.code.coding[0].code,\r\n    \"recordedAt\": doc.issued,\r\n    \"value\": doc.valueQuantity.value\r\n  });\r\n \r\n  let curl = SELECT CURL($url, {\r\n    \"request\": \"POST\",\r\n    \"header\": [ \"Content-Type: application\/json\", \"accept: application\/json\" ],\r\n    \"data\": $data\r\n  });\r\n \r\n  curl.execQuery();\r\n}\r\n \r\nfunction OnDelete(meta) {}<\/pre>\n<p>&nbsp;<\/p>\n<h2><strong>3)ANSI Joins<\/strong><\/h2>\n<p><strong>\u00a0<\/strong>Couchbase allows you to use <strong>joins<\/strong> in your queries for quite a long time, but so far, it could only be accomplished by using our own syntax. Since Couchbase 5.5 you can also use the ANSI JOIN syntax:<\/p>\n<pre class=\"lang:default decode:true \">SELECT DISTINCT route.destinationairport\r\nFROM `travel-sample` airport JOIN `travel-sample` route\r\n     ON airport.faa = route.sourceairport\r\n        AND route.type = \"route\"\r\nWHERE airport.type = \"airport\"\r\n  AND airport.city = \"San Francisco\"\r\n  AND airport.country = \"United States\";\r\n<\/pre>\n<p>You can read more about it <a href=\"https:\/\/www.couchbase.com\/blog\/ansi-join-support-n1ql\/\">here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>4)Full-Text Search <\/strong><\/h2>\n<p>Most of the user-facing applications eventually need to implement some sort of advanced search. This kind of feature usually requires you to push data to a third-party tool like Solr or Elastic Search. However, adding such tools increases the cost and complexity of your infrastructure significantly, not to mention all the code necessary to push Object\/Document changes to these tools.<\/p>\n<p>Starting with Couchbase 5.0, you can simply create full-text search index in the web console and start making full-text searches directly from the database:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5586\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM-1024x702.png\" alt=\"Full Text Search - Create Indes\" width=\"515\" height=\"353\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM-1024x702.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM-300x206.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM-768x526.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM-235x160.png 235w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM-20x14.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.16.06-PM.png 1027w\" sizes=\"auto, (max-width: 515px) 100vw, 515px\" \/><\/p>\n<p>Highlighting search results:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5587\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-09-at-5.19.18-PM-1024x327.png\" alt=\"\" width=\"900\" height=\"287\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.19.18-PM-1024x327.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.19.18-PM-300x96.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.19.18-PM-768x245.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.19.18-PM-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/Screen-Shot-2018-08-09-at-5.19.18-PM.png 1251w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Hot to make a simple search via SDK:<\/p>\n<pre class=\"lang:java decode:true\">    @Override\r\n    public List&lt;SearchQueryRow&gt; searchQuery(String word) {\r\n        String indexName = \"movies_index\";\r\n        QueryStringQuery query = SearchQuery.queryString(word);\r\n\r\n        SearchQueryResult result = movieRepository.getCouchbaseOperations().getCouchbaseBucket().query(\r\n                new SearchQuery(indexName, query).highlight().limit(20));\r\n\r\n        List&lt;SearchQueryRow&gt; hits = new ArrayList&lt;&gt;();\r\n        if (result != null &amp;&amp; result.errors().isEmpty()) {\r\n            Iterator&lt;SearchQueryRow&gt; resultIterator = result.iterator();\r\n            while (resultIterator.hasNext()) {\r\n                hits.add(resultIterator.next());\r\n            }\r\n        }\r\n        return hits;\r\n    }<\/pre>\n<p>You can view the official documentation <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/fts\/full-text-intro.html\">here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>5)\u00a0Faster queries, GROUP BYs and Aggregation Pushdown<\/strong><\/h2>\n<p>Regardless of the database, aggregations (min, max, avg, etc) and GROUP BYs operations have always been problematic in terms of performance. In order to tackle this issue, with Couchbase 5.5, you can leverage your indexes to speed up these types of queries:<\/p>\n<pre class=\"lang:default decode:true\">SELECT country, state, city, COUNT(1) AS total\r\nFROM `travel-sample`\r\nWHERE type = 'hotel' and country is not null\r\nGROUP BY country, state, city\r\nORDER BY COUNT(1) DESC;<\/pre>\n<p>~90ms &#8211; Query plan of the query above<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5588\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/10204-query-plan-no-pushdown-1024x160.png\" alt=\"\" width=\"900\" height=\"141\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10204-query-plan-no-pushdown-1024x160.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10204-query-plan-no-pushdown-300x47.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10204-query-plan-no-pushdown-768x120.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10204-query-plan-no-pushdown-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10204-query-plan-no-pushdown.png 1238w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>~7ms &#8211; Same query as before but using a proper index<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5589\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/10205-query-plan-with-pushdown-1024x153.png\" alt=\"\" width=\"900\" height=\"134\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10205-query-plan-with-pushdown-1024x153.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10205-query-plan-with-pushdown-300x45.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10205-query-plan-with-pushdown-768x115.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10205-query-plan-with-pushdown-20x3.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/10205-query-plan-with-pushdown.png 1297w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p>You can read the <a href=\"https:\/\/www.couchbase.com\/blog\/new-querying-features-couchbase-server\/\">full article here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>6)Role-Based Access Control and X509 cert<\/strong><\/h2>\n<p><strong>\u00a0<\/strong>Databases are the jackpot for any malicious intruder, which is why it is never too much to add an extra layer of security. With Couchbase, <a href=\"https:\/\/www.couchbase.com\/blog\/x-509-certificate-based-authentication\/\">you can authenticate clients using X.509 certificates<\/a> and limit their access via Role Based Access Control (RBAC):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-5590\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/08\/06602-create-new-user-with-select-authorization.gif\" alt=\"\" width=\"650\" height=\"518\" \/><\/p>\n<p>You can also grant permissions via N1QL. Let&#8217;s see how\u00a0granting a SELECT permission for the user <strong>denis<\/strong> in the bucket <strong>some_bucket<\/strong> would look like:<\/p>\n<pre class=\"lang:default decode:true\">GRANT ROLE query_select(some_bucket) TO denis;<\/pre>\n<p>You can read more about it <a href=\"https:\/\/www.couchbase.com\/blog\/using-role-based-access-control-in-n1ql\/\">here<\/a> or <a href=\"https:\/\/www.couchbase.com\/blog\/authentication-authorization-rbac-part-2\/\">here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>7)Field Encryption<\/strong><\/h2>\n<p>Encryption at rest is one of the most basic forms of security, and you can easily encrypt\/decrypt fields using the <a href=\"https:\/\/github.com\/couchbase\/java-couchbase-encryption\">Couchbase\u2019s Java Encryption<\/a>:<\/p>\n<pre class=\"lang:java decode:true\">public static class Person {\r\n    @Id\r\n    public String id;\r\n\r\n    @EncryptedField(provider = \"AES\")\r\n    public String password;\r\n\r\n    \/\/The rest will be transported and stored unencrypted\r\n    public String firstName;\r\n    public String lastName;\r\n    public String userName;\r\n    public int age;\r\n  }<\/pre>\n<p>Read more about it <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/sdk\/java\/encrypting-using-sdk.html\">here<\/a> or <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/sdk\/encryption.html\">here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>8) Reactive SDK<\/strong><\/h2>\n<p>We also offer a reactive SDK, which is not something easy to find in a good portion of the database providers. This is mostly due to the fact that our SDK itself is implemented reactively.<\/p>\n<p>Reactive programming is really important for performance and resource optimization. If you are not familiar with this concept yet, I highly recommend <a href=\"https:\/\/www.couchbase.com\/blog\/why-you-should-care-about-reactive-database-access\/\">this article<\/a>, which gives you a quick overview of why you might consider using reactive programming in your persistence layer.<\/p>\n<p>We have an extensive material on this topic. If you would like to know more, you can start <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/java\/async-programming.html\">here<\/a> or <a href=\"https:\/\/www.youtube.com\/watch?v=BS0MWy5QND8&amp;t=711s\">here<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>9) &#8220;Fine Speed Tuning&#8221; via SDK<\/strong><\/h2>\n<p>At Couchbase, we try to empower developers to fine-tune their performance even at the document level, so developers can decide, case-by-case, what is the best trade-off for each scenario.<\/p>\n<p>Let\u2019s take a look, for instance, at how Couchbase stores data. By default, as soon as the server acknowledges that a new document should be stored, it already sends the response back to the client saying that your \u201crequest has been received successfully\u201d and asynchronously, we store and replicated the document.<\/p>\n<p>This approach is very good for speed but there is a small chance of losing data if the server crashes when the document is still in the server\u2019s memory. \u00a0If you want to avoid that, you can specify via SDK that you would like to receive the confirmation only after the document has been replicated or stored in the disk:<\/p>\n<pre class=\"lang:java decode:true \">movieRepository.getCouchbaseOperations().save(movie, PersistTo.ONE, ReplicateTo.NONE);\r\n\/\/or\r\nmovieRepository.getCouchbaseOperations().save(movie, PersistTo.ONE, ReplicateTo.TWO);\r\n...\r\nmovieRepository.getCouchbaseOperations().save(movie, PersistTo.NONE, ReplicateTo.ONE);\r\n<\/pre>\n<p>Why allow such a thing? Well, because if you can afford the small chance of losing this data if the server crashes, you can improve your performance significantly. This is not an all-or-nothing decision as you can decide which parts of the system worth such a risk.<\/p>\n<p>You can also do something similar with your queries. In this case, if you would like to wait for the indexes\/views to be updated based on the last changes or whether you are fine with the small chance of not returning the most recent version of your documents:<\/p>\n<pre class=\"lang:java decode:true\">\/\/You can use ScanConsistency.REQUEST_PLUS, ScanConsistency.NOT_BOUNDED or ScanConsistency.STATEMENT_PLUS\r\nN1qlParams params = N1qlParams.build().consistency(ScanConsistency.REQUEST_PLUS).adhoc(true);\r\nParameterizedN1qlQuery query = N1qlQuery.parameterized(queryString, JsonObject.create(), params);\r\nresourceRepository.getCouchbaseOperations().getCouchbaseBucket().query(query);<\/pre>\n<p>There are a few other features in our SDK that can also be optimized, and all these small decisions can significantly improve your performance at scale.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>10)\u00a0Response Time Observability<\/strong><\/h2>\n<p>I have already mentioned this item in my <a href=\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-devops-sys-admins-must-know-about-couchbase\/\">previous blog post<\/a>, but I think it worth being mentioned again. Since version 5.5, we have introduced a new capability called Response Time Observability, which will provide to system developers a very simple way to observe response times relative to a (tune-able) threshold.<\/p>\n<p>This feature, which uses OpenTracing format, logs slow requests followed by a bunch of details about it after each time interval, so you can easily identify the operations with poor performance.<\/p>\n<pre class=\"lang:default decode:true \">Apr 04, 2018 9:42:57 AM com.couchbase.client.core.tracing.ThresholdLogReporter logOverThreshold\r\nWARNING: Operations over threshold: [ {\r\n  \"top\" : [ {\r\n    \"server_us\" : 8,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x6\",\r\n    \"dispatch_us\" : 315,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 576\r\n  }, {\r\n    \"server_us\" : 8,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x5\",\r\n    \"dispatch_us\" : 319,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 599\r\n  }, {\r\n    \"server_us\" : 8,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x4\",\r\n    \"dispatch_us\" : 332,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 632\r\n  }, {\r\n    \"server_us\" : 11,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x3\",\r\n    \"dispatch_us\" : 392,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 762\r\n  }, {\r\n    \"server_us\" : 23,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"get:0x1\",\r\n    \"decode_us\" : 9579,\r\n    \"dispatch_us\" : 947,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 16533\r\n  }, {\r\n    \"server_us\" : 56,\r\n    \"encode_us\" : 12296,\r\n    \"local_id\" : \"41837B87B9B1C5D1\/000000004746B9AA\",\r\n    \"local_address\" : \"127.0.0.1:55011\",\r\n    \"operation_id\" : \"upsert:0x2\",\r\n    \"dispatch_us\" : 1280,\r\n    \"remote_address\" : \"127.0.0.1:11210\",\r\n    \"total_us\" : 20935\r\n  } ],\r\n  \"service\" : \"kv\",\r\n  \"count\" : 6\r\n} ]<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"background: white; vertical-align: baseline; margin: 0in 0in 16.8pt 0in;\">Response Time Observability is on by default, and we have already defined a set of thresholds to avoid logging healthy requests. If you want to push the limits of your cluster, you can even set smaller thresholds manually. You can read more about it\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/response-time-observability-with-the-java-sdk\/\"><span style=\"color: windowtext; text-decoration: none;\">here<\/span><\/a>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Couchbase Server 5.0 and 5.5 were two big releases. Let\u2019s see some of the new cool and old features which developers can\u2019t miss out: 1) Sub Documents This feature has been here for a while, but it\u2019s still worth to [&hellip;]<\/p>\n","protected":false},"author":8754,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815],"tags":[],"ppma_author":[9059],"class_list":["post-5584","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>10 other things that developers must know about Couchbase<\/title>\n<meta name=\"description\" content=\"Learn the 10 features that developers must know about the Couchbase Server 5.0 and 5.5 to avoid logging healthy requests.\" \/>\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\/10-other-things-that-developers-must-know-about-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"10 other things that developers must know about Couchbase\" \/>\n<meta property=\"og:description\" content=\"Learn the 10 features that developers must know about the Couchbase Server 5.0 and 5.5 to avoid logging healthy requests.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-09T17:08:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-01-02T13:45:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@deniswsrosa\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis Rosa, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/\"},\"author\":{\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257\"},\"headline\":\"10 other things that developers must know about Couchbase\",\"datePublished\":\"2018-08-09T17:08:54+00:00\",\"dateModified\":\"2019-01-02T13:45:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/\"},\"wordCount\":1067,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Best Practices and Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/\",\"name\":\"10 other things that developers must know about Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-08-09T17:08:54+00:00\",\"dateModified\":\"2019-01-02T13:45:56+00:00\",\"description\":\"Learn the 10 features that developers must know about the Couchbase Server 5.0 and 5.5 to avoid logging healthy requests.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#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\/10-other-things-that-developers-must-know-about-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"10 other things that developers must know about Couchbase\"}]},{\"@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\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\/fe3c5273e805e72a5294611a48f62257\",\"name\":\"Denis Rosa, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g\",\"caption\":\"Denis Rosa, Developer Advocate, Couchbase\"},\"description\":\"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app.\",\"sameAs\":[\"https:\/\/x.com\/deniswsrosa\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/denis-rosa\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"10 other things that developers must know about Couchbase","description":"Learn the 10 features that developers must know about the Couchbase Server 5.0 and 5.5 to avoid logging healthy requests.","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\/10-other-things-that-developers-must-know-about-couchbase\/","og_locale":"en_US","og_type":"article","og_title":"10 other things that developers must know about Couchbase","og_description":"Learn the 10 features that developers must know about the Couchbase Server 5.0 and 5.5 to avoid logging healthy requests.","og_url":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-08-09T17:08:54+00:00","article_modified_time":"2019-01-02T13:45:56+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Denis Rosa, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@deniswsrosa","twitter_misc":{"Written by":"Denis Rosa, Developer Advocate, Couchbase","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/"},"author":{"name":"Denis Rosa, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/fe3c5273e805e72a5294611a48f62257"},"headline":"10 other things that developers must know about Couchbase","datePublished":"2018-08-09T17:08:54+00:00","dateModified":"2019-01-02T13:45:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/"},"wordCount":1067,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Best Practices and Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/","name":"10 other things that developers must know about Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-08-09T17:08:54+00:00","dateModified":"2019-01-02T13:45:56+00:00","description":"Learn the 10 features that developers must know about the Couchbase Server 5.0 and 5.5 to avoid logging healthy requests.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/10-other-things-that-developers-must-know-about-couchbase\/#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\/10-other-things-that-developers-must-know-about-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"10 other things that developers must know about Couchbase"}]},{"@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":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@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\/fe3c5273e805e72a5294611a48f62257","name":"Denis Rosa, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/be0716f6199cfb09417c92cf7a8fa8d6","url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","caption":"Denis Rosa, Developer Advocate, Couchbase"},"description":"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app.","sameAs":["https:\/\/x.com\/deniswsrosa"],"url":"https:\/\/www.couchbase.com\/blog\/author\/denis-rosa\/"}]}},"authors":[{"term_id":9059,"user_id":8754,"is_guest":0,"slug":"denis-rosa","display_name":"Denis Rosa, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f8d1f5c13115122cab89d0f229b904480bfe20d3dfbb093fe9734cda5235d419?s=96&d=mm&r=g","author_category":"","last_name":"Rosa, Developer Advocate, Couchbase","first_name":"Denis","job_title":"","user_url":"","description":"Denis Rosa is a Developer Advocate for Couchbase and lives in Munich - Germany. He has a solid experience as a software engineer and speaks fluently Java, Python, Scala and Javascript. Denis likes to write about search, Big Data, AI, Microservices and everything else that would help developers to make a beautiful, faster, stable and scalable app."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/5584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/8754"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=5584"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/5584\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=5584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=5584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=5584"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=5584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}