{"id":4162,"date":"2024-09-25T17:13:09","date_gmt":"2024-09-26T00:13:09","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/"},"modified":"2024-09-25T17:13:09","modified_gmt":"2024-09-26T00:13:09","slug":"simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/","title":{"rendered":"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse"},"content":{"rendered":"\n<p><span>Ensuring a seamless flow of data is crucial for effective analysis and decision-making. Today, with data often being unstructured and nested, the choice of database plays a significant role in optimizing processing efficiency and query performance.<\/span><\/p>\n\n\n\n<p><span>In this blog post, we\u2019ll explore the process of data ingestion from MongoDB, a NoSQL database into both ClickHouse, a relational database, and <a href=\"https:\/\/www.couchbase.com\/products\/analytics\/\">Couchbase Capella Columnar<\/a>, a NoSQL analytical database. We&#8217;ll focus on the preprocessing needed, query efficiency for joins after ingestion, and how each handles real-time data changes. We will show how Capella Columnar simplifies working with nested data, making it easier to store and query compared to the complexities in relational databases like ClickHouse.<\/span><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>TL;DR<\/strong><\/p>\n\n\n\n<p><span>ClickHouse requires extensive preprocessing for data ingestion due to the unnesting of nested data, and adding new fields can necessitate the creation of additional tables. Data from a single MongoDB collection must be split into separate tables, which means joins are required for querying\u2014these can be resource-intensive. Moreover, adding a new nested field in real-time involves re-creating separate tables and updating schemas, leading to potential pipeline breaks and requiring manual intervention. In contrast, Capella Columnar simplifies the process by not requiring preprocessing for nested data. It allows direct ingestion from MongoDB collections without the need for separate tables or joins, and it automatically reflects real-time changes like adding new nested fields without additional processing.<\/span><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What is Capella Columnar?<\/h2>\n\n\n\n<p>Before diving into this migration demo, you may want to watch our in-depth overview of Capella Columnar video or read our <a href=\"https:\/\/www.couchbase.com\/blog\/free-tier-capella-columnar-mobile-vector-search-and-more\/\">recent announcement<\/a> that introduce this new technology that converges operational and real-time analytic workloads:<\/p>\n\n\n\n<p><iframe loading=\"lazy\" title=\"Couchbase Capella Columnar: An in-depth technical overview\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/pXoenAEhz9Q?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>Sample MongoDB data<\/span><\/h2>\n\n\n\n<p><span>For the scope of this demo, we have used the sample MongoDB collection <\/span><span>theaters<\/span><span> of\u00a0 the <\/span><em><span>sample_mflix <\/span><\/em><span>database.\u00a0<\/span><\/p>\n\n\n\n<p><span>Here is a sample document from the theaters collection:<\/span><\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]{<br \/>\n\u00a0\u00a0&#8220;_id&#8221;: {<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;$oid&#8221;: &#8220;59a47286cfa9a3a73e51e72c&#8221;<br \/>\n\u00a0\u00a0},<br \/>\n\u00a0\u00a0&#8220;theaterId&#8221;: 1000,<br \/>\n\u00a0\u00a0&#8220;location&#8221;: {<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;address&#8221;: {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;street1&#8221;: &#8220;x1&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;city&#8221;: &#8220;Bloomington&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;state&#8221;: &#8220;MN&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;zipcode&#8221;: &#8220;55425&#8221;<br \/>\n\u00a0\u00a0\u00a0\u00a0},<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;geo&#8221;: {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;type&#8221;: &#8220;Point&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;coordinates&#8221;: [<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-93.24565,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a044.85466<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<br \/>\n\u00a0\u00a0\u00a0\u00a0}<br \/>\n\u00a0\u00a0}<br \/>\n}[\/crayon]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16371\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image1-5-1024x535-1.png\" alt=\"\" width=\"900\" height=\"470\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>Data ingestion from MongoDB to Capella Columnar<\/span><\/h2>\n\n\n\n<p><span>We can utilize Kafka Links in Capella Columnar to ingest data from Kafka topics, where data from MongoDB collections has already been published.<\/span><span> To make this happen, users need to set up their Kafka pipeline, where MongoDB data is funneled into Kafka topics.<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span>Step 1 &#8211; connect MongoDB to Kafka<\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span>Download the <\/span><a href=\"https:\/\/debezium.io\/documentation\/reference\/stable\/connectors\/mongodb.html\"><span>Debezium MongoDB source connector<\/span><\/a><\/li>\n\n\n<li><span>Run Kafka Connect \u2013 in either standalone or distributed mode<\/span><\/li>\n\n\n<li><span>Send a POST request with the required connection properties to link up with <\/span><span><br>\n<\/span> <span>MongoDB<\/span><\/li>\n\n<\/ul>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]curl -X POST -H &#8220;Content-Type: application\/json&#8221; https:\/\/localhost:8083\/connectors -d &#8216;{&#8220;name&#8221;: &#8220;&lt;name&gt;&#8221;,&#8221;config&#8221;: {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;connector.class&#8221;: &#8220;io.debezium.connector.mongodb.MongoDbConnector&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;capture.mode&#8221;: &#8220;change_streams_update_full&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;mongodb.ssl.enabled&#8221;: &#8220;true&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;topic.prefix&#8221;: &#8220;&lt;topic_prefix&gt;&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;value.converter&#8221;: &#8220;org.apache.kafka.connect.json.JsonConverter&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;value.converter.schemas.enable&#8221;: &#8220;false&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;key.converter.schemas.enable&#8221;: &#8220;false&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;key.converter&#8221;: &#8220;org.apache.kafka.connect.json.JsonConverter&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;collection.include.list&#8221;: &#8220;sample_mflix.theaters&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8220;mongodb.connection.string&#8221;:&lt;mongo connection string&gt;}}&#8217;\u00af[\/crayon]<\/p>\n\n\n\n<p><i><span>Please replace the placeholders in the curl request (indicated by the angle brackets, e.g., <\/span><\/i><i><span>&lt;value&gt;<\/span><\/i><i><span>) with the appropriate values for your specific use case.<\/span><\/i><\/p>\n\n\n\n<p><span>After that, your data will find its way into the Kafka topic. The data will be present in the Confluent Kafka topic <\/span><em>mongo_columnar_topic.sample_mflix.theaters<\/em>:<\/p>\n\n\n\n<p><span><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16372\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image9-1024x499-1.png\" alt=\"\" width=\"900\" height=\"439\"><\/span><\/p>\n\n\n\n<p><span>Once the data in the Kafka topic, now we can use Capella Columnar to pull data from the Kafka topic into collections.<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span>Step 2 &#8211; create a link in Capella Columnar<\/span><\/h3>\n\n\n\n<p><span>In this example we are using Confluent Kafka as the Kafka flavor, Capella Columnar also supports Amazon MSK as well.<\/span><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16373\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image4-1-1024x500-1.png\" alt=\"\" width=\"900\" height=\"439\"><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16374\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image3-3-1024x503-1.png\" alt=\"\" width=\"900\" height=\"442\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span>Step 3 &#8211; create a linked collection<\/span><\/h3>\n\n\n\n<p><span>After creating a link, we need to create a linked collection where data will be stored:<\/span><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16375\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image5-2-1024x503-1.png\" alt=\"\" width=\"900\" height=\"442\"><\/p>\n\n\n\n<p><span>The fields are self explanatory, the field primary key is the path of the primary key in the MongoDB document residing in Kafka topic. In the given example the primary key for the MongoDB document is <em>objectId<\/em>:<\/span><\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]_id`$oid`: String[\/crayon]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16376\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image17-1024x502-2.png\" alt=\"\" width=\"900\" height=\"441\"><\/p>\n\n\n\n<p><span>Enabling CDC creates an agreement on the format of the document which the Capella Columnar engine understands. Currently we only support Debezium as a source connector.<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span>Step 4 &#8211; connect the link<\/span><\/h3>\n\n\n\n<p><span>After creating the collection we have to <\/span><b>connect <\/b><span>the link.<\/span><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16377\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image8-1-1024x500-1.png\" alt=\"\" width=\"900\" height=\"439\"><\/p>\n\n\n\n<p><span>Once the link has been connected, the data should be flowing in, as we can see from the below query.<\/span><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16378\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image7-2-1024x501-1.png\" alt=\"\" width=\"900\" height=\"440\"><\/p>\n\n\n\n<p><span>The data ingestion from MongoDB to Capella Columnar was seamless and intuitive. Now, let\u2019s turn our attention to the challenges we encounter with relational databases like ClickHouse.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>Data migration from MongoDB to ClickHouse<\/span><\/h2>\n\n\n\n<p><span>ClickHouse is a relational database, we can&#8217;t migrate data directly from MongoDB due to its document-based and nested data structures. This requires an additional data transformation step. The complexity of this transformation increases if the MongoDB data is highly nested or if additional fields are introduced, requiring adjustments, such as creating extra tables to manage these changes.<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating a table in ClickHouse for MongoDB collections<\/h3>\n\n\n\n<p><span>To create a table in ClickHouse that maps to a <\/span><a href=\"https:\/\/clickhouse.com\/docs\/en\/engines\/table-engines\/integrations\/mongodb\"><span>MongoDB<\/span><\/a><span> collection, we use the following syntax:<\/span><\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]CREATE TABLE [IF NOT EXISTS] [db.]table_name<br \/>\n(<br \/>\n\u00a0\u00a0\u00a0name1 [type1],<br \/>\n\u00a0\u00a0\u00a0name2 [type2],<br \/>\n\u00a0\u00a0\u00a0&#8230;<br \/>\n) ENGINE = MongoDB(host:port, database, collection, user, password [, options]);[\/crayon]<\/p>\n\n\n\n<p><span>The MongoDB collection referenced here should be <em>unnested<\/em> before pointing to it.<\/span><\/p>\n\n\n\n<p><span>We have a <\/span><span>theaters<\/span><span> collection in MongoDB, and our goal is to represent this data in a structured, relational format in ClickHouse.<\/span><\/p>\n\n\n\n<p><span>Since ClickHouse does not support nested fields, we&#8217;ll need to create three tables to handle the <\/span><span>theaters<\/span><span> data with these schemas:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>theaters<\/b><span>: _id, theaterId<\/span><\/li>\n\n\n<li><b>theaters_location_address<\/b><span>: Street1, city, state, zipcode<\/span><\/li>\n\n\n<li><b>theaters_location_geo<\/b><span>: type, coordinates<\/span><\/li>\n\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span>Preprocessing<\/span><\/h3>\n\n\n\n<p><span>To prepare the data, we first perform preprocessing on the MongoDB side to unnest the necessary fields. This involves creating MongoDB pipelines to extract and flatten the nested fields into separate collections for <\/span><em><span>Address<\/span><\/em><span> and <\/span><em><span>Geo<\/span><\/em><span>, while the <\/span><em><span>Theaters<\/span><\/em><span> table can be created directly.<\/span><\/p>\n\n\n\n<p>Pipelines for MongoDB <em>Address <\/em>collection:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16379\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image14-1024x587-1.png\" alt=\"\" width=\"900\" height=\"516\"><\/p>\n\n\n\n<p>Pipeline for <i>Geo<\/i><span> collection:<\/span><\/p>\n\n\n\n<p><span><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16380\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image6-2-1024x531-1.png\" alt=\"\" width=\"900\" height=\"467\"><br>\n<\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating tables in ClickHouse<\/h3>\n\n\n\n<p><span>Once preprocessing is complete, we create three corresponding tables in ClickHouse:<\/span><\/p>\n\n\n\n<p>Query to create <em>theaters<\/em>:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16381\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image15-1024x508-1.png\" alt=\"\" width=\"900\" height=\"446\"><\/p>\n\n\n\n<p>Query to create <em>theaters_location_address:<\/em><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16382\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image2-5-1024x539-1.png\" alt=\"\" width=\"900\" height=\"474\"><\/p>\n\n\n\n<p>Query to create <em>theaters_location_geo<\/em>:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16383\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image13-1024x514-1.png\" alt=\"\" width=\"900\" height=\"452\"><\/p>\n\n\n\n<p><span>Having completed the data ingestion from MongoDB to ClickHouse, let us explore how real-time data changes are handled in both systems. We\u2019ll examine the ease of managing these changes in Capella Columnar compared to the challenges faced with ClickHouse.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>How are real-time changes handled?<\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Modification on the MongoDB side<\/h3>\n\n\n\n<p><span>Let&#8217;s change one document on MongoDB and add a nested owner field.<\/span><\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]{<br \/>\n\u00a0\u00a0&#8220;Owner&#8221;: {<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;name&#8221;: &#8220;John&#8221;,<br \/>\n\u00a0\u00a0\u00a0\u00a0&#8220;age&#8221;: 50<br \/>\n\u00a0\u00a0}<br \/>\n}[\/crayon]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16384\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image16-1024x503-1.png\" alt=\"\" width=\"900\" height=\"442\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Live CDC changes in Capella Columnar<\/h3>\n\n\n\n<p><span>No extra step is required. On querying the particular document, we can see the change getting reflected:<\/span><\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16385\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image12-1024x504-1.png\" alt=\"\" width=\"900\" height=\"443\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span>Setting up ClickHouse<\/span><\/h3>\n\n\n\n<p><span>ClickHouse faces challenges for real-time changes, as the pipeline breaks when attempting to bring in changes directly.<\/span><\/p>\n\n\n\n<p><span>To fetch the updated data containing the <\/span><em><span>Owner<\/span><\/em><span> field, you\u2019ll need to create another table in ClickHouse. First, create a new MongoDB collection where the <\/span><em><span>Owner<\/span><\/em><span> field is unnested, and then define a corresponding table in ClickHouse.<\/span><\/p>\n\n\n\n<p>Pipeline on MongoDB to create owner collection:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16386\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image11-1024x505-1.png\" alt=\"\" width=\"900\" height=\"444\"><b><\/b><\/p>\n\n\n\n<p>Creating the <em>owner<\/em> table in ClickHouse:<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16387\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image10-1024x509-1.png\" alt=\"\" width=\"900\" height=\"447\"><\/p>\n\n\n\n<p><span>Now, as we transition to querying the data, it\u2019s important to note that in ClickHouse, executing even simple queries requires stitching the data together, as we created different tables to unnest the original data. In contrast, Capella Columnar handles these queries effortlessly, requiring no additional steps.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>Querying data in Capella Columnar vs. ClickHouse<\/span><\/h2>\n\n\n\n<p><span>Let\u2019s retrieve all the <\/span><em><span>theaterId<\/span><\/em><span> and <\/span><span><em>street1<\/em><\/span><span>\u00a0where the <\/span><em><span>geo<\/span><\/em> <span>type<\/span><span> is <\/span><em><span>Point<\/span><\/em><span> in both ClickHouse and Capella Columnar.<\/span><\/p>\n\n\n\n<p><span>Query for Capella Columnar:<\/span><\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]select theaterId, address.street1 from columnar_th where geo.type = &#8216;Point&#8217;;[\/crayon]<\/p>\n\n\n\n<p><span>Query for ClickHouse:<\/span><\/p>\n\n\n<p>[crayon nums=&#8221;false&#8221; wrap=&#8221;true&#8221; lang=&#8221;default&#8221; decode=&#8221;true&#8221;]select theaterId, street1 from theaters_location_geo inner join theaters_location_address on theaters_location_geo.theaterId = theaters_location_address.theaterId where `type` = &#8216;Point&#8217;;[\/crayon]<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-16388\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/image18-1024x482-1.png\" alt=\"\" width=\"900\" height=\"424\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>Comparison of ClickHouse and Capella Columnar<\/span><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<tbody>\n<tr>\n<td><b>Parameter<\/b><\/td>\n<td><b>ClickHouse<\/b><\/td>\n<td><b>Capella Columnar<\/b><\/td>\n<\/tr>\n<tr>\n<td>Data Ingestion<\/td>\n<td>Extensive preprocessing is required due to the unnesting of nested data, and the addition of fields into columns can necessitate the creation of additional tables.<\/td>\n<td>No preprocessing required for nested data.<\/td>\n<\/tr>\n<tr>\n<td>Schema and Data Transformation<\/td>\n<td>Data from a single MongoDB collection needs to be split into separate tables, with joins required for querying, which can be expensive.<\/td>\n<td>Data can be ingested directly from the MongoDB collection without the need for separate tables or joins.<\/td>\n<\/tr>\n<tr>\n<td>Real-Time Data Changes<\/td>\n<td>Adding a new nested field requires re-creating separate tables to unnest the data, necessitating schema updates and potentially complex transformations.\n<p>This leads to pipeline breaks and requires manual intervention.<\/p><\/td>\n<td>Real-time changes, like adding a new nested field, are automatically reflected without additional processing.<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span>Conclusion<\/span><\/h2>\n\n\n\n<p>In summary, Couchbase Capella offers a more streamlined approach to ingesting and querying nested MongoDB data, minimizing preprocessing and handling real-time changes with ease. In contrast, ClickHouse requires extensive data transformation and schema adjustments, making it less efficient for managing complex, nested structures. For environments dealing with real-time data and nested formats, Capella Columnar proves to be the more flexible and efficient choice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span>References<\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Watch: <a href=\"https:\/\/www.youtube.com\/watch?v=pXoenAEhz9Q\"><span>Capella Columnar: An in-depth technical overview<\/span><\/a><\/li>\n\n\n<li><a href=\"https:\/\/dzone.com\/articles\/keep-calm-and-column-wise\"><span>Keep Calm and Column Wise<\/span><\/a><\/li>\n\n\n<li><a href=\"https:\/\/www.vldb.org\/pvldb\/vol15\/p2085-alkowaileet.pdf\"><span>Columnar Formats for Schemaless LSM-based Document Stores<\/span><\/a><\/li>\n\n\n<li><a href=\"https:\/\/docs.couchbase.com\/columnar\/intro\/intro.html\"><span>About Capella Columnar<\/span><\/a><\/li>\n\n\n<li><a href=\"https:\/\/cloud.couchbase.com\">Sign up to use Couchbase Capella for free<\/a><\/li>\n\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Ensuring a seamless flow of data is crucial for effective analysis and decision-making. Today, with data often being unstructured and nested, the choice of database plays a significant role in optimizing processing efficiency and query performance. In this blog post, we\u2019ll explore the process of data ingestion from MongoDB, a NoSQL database into both ClickHouse, [&hellip;]<\/p>\n","protected":false},"author":85045,"featured_media":4160,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[769,178,301],"tags":[901,215,44],"ppma_author":[792,902,903],"class_list":["post-4162","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-columnar","category-connectors","category-cloud","tag-clickhouse","tag-data-migration","tag-mongodb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Efficiently ingest and query nested data in Capella Columnar vs. ClickHouse, comparing preprocessing, schema transformation, and real-time updates.\" \/>\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\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse\" \/>\n<meta property=\"og:description\" content=\"Efficiently ingest and query nested data in Capella Columnar vs. ClickHouse, comparing preprocessing, schema transformation, and real-time updates.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-26T00:13:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-capella-columnar-clickhouse.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=\"Janhavi Tripurwar, Ayush Tripathi, Ritik Raj\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Janhavi Tripurwar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/\"},\"author\":{\"name\":\"Janhavi Tripurwar\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/ab5a3d2b46d873085ba0070bd4db0e5e\"},\"headline\":\"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse\",\"datePublished\":\"2024-09-26T00:13:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/\"},\"wordCount\":1590,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-capella-columnar-clickhouse.png\",\"keywords\":[\"clickhouse\",\"Data Migration\",\"mongodb\"],\"articleSection\":[\"Columnar\",\"Connectors\",\"Couchbase Capella\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/\",\"name\":\"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-capella-columnar-clickhouse.png\",\"datePublished\":\"2024-09-26T00:13:09+00:00\",\"description\":\"Efficiently ingest and query nested data in Capella Columnar vs. ClickHouse, comparing preprocessing, schema transformation, and real-time updates.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-capella-columnar-clickhouse.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/blog-capella-columnar-clickhouse.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse\"}]},{\"@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\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/ab5a3d2b46d873085ba0070bd4db0e5e\",\"name\":\"Janhavi Tripurwar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c6f62f8a679cd27f92c923093cafcab4b538e8d69812fbd23e9e3d1e6420dcd4?s=96&d=mm&r=gd9f5349ce28f07ea0e24b7fd9093e78c\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c6f62f8a679cd27f92c923093cafcab4b538e8d69812fbd23e9e3d1e6420dcd4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c6f62f8a679cd27f92c923093cafcab4b538e8d69812fbd23e9e3d1e6420dcd4?s=96&d=mm&r=g\",\"caption\":\"Janhavi Tripurwar\"},\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/author\\\/janhavitripurwar\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse - The Couchbase Blog","description":"Efficiently ingest and query nested data in Capella Columnar vs. ClickHouse, comparing preprocessing, schema transformation, and real-time updates.","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\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/","og_locale":"en_US","og_type":"article","og_title":"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse","og_description":"Efficiently ingest and query nested data in Capella Columnar vs. ClickHouse, comparing preprocessing, schema transformation, and real-time updates.","og_url":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-09-26T00:13:09+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-capella-columnar-clickhouse.png","type":"image\/png"}],"author":"Janhavi Tripurwar, Ayush Tripathi, Ritik Raj","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Janhavi Tripurwar","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/"},"author":{"name":"Janhavi Tripurwar","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ab5a3d2b46d873085ba0070bd4db0e5e"},"headline":"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse","datePublished":"2024-09-26T00:13:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/"},"wordCount":1590,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-capella-columnar-clickhouse.png","keywords":["clickhouse","Data Migration","mongodb"],"articleSection":["Columnar","Connectors","Couchbase Capella"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/","url":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/","name":"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-capella-columnar-clickhouse.png","datePublished":"2024-09-26T00:13:09+00:00","description":"Efficiently ingest and query nested data in Capella Columnar vs. ClickHouse, comparing preprocessing, schema transformation, and real-time updates.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-capella-columnar-clickhouse.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/blog-capella-columnar-clickhouse.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/simplifying-real-time-analytics-on-json-capella-columnar-vs-clickhouse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Simplifying Real-Time Analytics on JSON: Capella Columnar vs. ClickHouse"}]},{"@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\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ab5a3d2b46d873085ba0070bd4db0e5e","name":"Janhavi Tripurwar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c6f62f8a679cd27f92c923093cafcab4b538e8d69812fbd23e9e3d1e6420dcd4?s=96&d=mm&r=gd9f5349ce28f07ea0e24b7fd9093e78c","url":"https:\/\/secure.gravatar.com\/avatar\/c6f62f8a679cd27f92c923093cafcab4b538e8d69812fbd23e9e3d1e6420dcd4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c6f62f8a679cd27f92c923093cafcab4b538e8d69812fbd23e9e3d1e6420dcd4?s=96&d=mm&r=g","caption":"Janhavi Tripurwar"},"url":"https:\/\/www.couchbase.com\/blog\/author\/janhavitripurwar\/"}]}},"acf":[],"authors":[{"term_id":792,"user_id":85045,"is_guest":0,"slug":"janhavitripurwar","display_name":"Janhavi Tripurwar","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/janhavi-couchbase-4.jpg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/janhavi-couchbase-4.jpg"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""},{"term_id":902,"user_id":85528,"is_guest":0,"slug":"ayushkumartripathi","display_name":"Ayush Tripathi","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/ab8d3244859342fa389fed32cf53f2d5dc94a4a30b0c570c7b336bcd9741fa64?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""},{"term_id":903,"user_id":85529,"is_guest":0,"slug":"ritikraj","display_name":"Ritik Raj","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/cfe4dbb21fb16ea9137ea6cc359220689e437885565d7bcfaa8796438ba6c163?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/4162","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\/85045"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=4162"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/4162\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/4160"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=4162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=4162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=4162"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=4162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}