{"id":866,"date":"2026-07-02T06:08:06","date_gmt":"2026-07-01T23:08:06","guid":{"rendered":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/the-ultimate-guide-to-using-mongodb-with-node-js-from-setup-to-production\/"},"modified":"2026-07-02T06:08:06","modified_gmt":"2026-07-01T23:08:06","slug":"the-ultimate-guide-to-using-mongodb-with-node-js-from-setup-to-production","status":"publish","type":"post","link":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/the-ultimate-guide-to-using-mongodb-with-node-js-from-setup-to-production\/","title":{"rendered":"The Ultimate Guide to Using MongoDB with Node.js: From Setup to Production"},"content":{"rendered":"<p>&#8220;`html<\/p>\n<h1>The Ultimate Guide to Using MongoDB with Node.js: From Setup to Production<\/h1>\n<p>When it comes to building modern, data-driven web applications, few technology stacks are as popular and powerful as MongoDB combined with Node.js. MongoDB provides a flexible, document-oriented NoSQL database that allows you to store data in a JSON-like format, while Node.js offers a high-performance, event-driven JavaScript runtime on the server side. Together, they enable developers to create full\u2011stack applications with a single programming language (JavaScript) and a seamless data flow that scales horizontally with ease. Whether you are building a real\u2011time chat app, an e\u2011commerce platform, or a RESTful API, understanding how to integrate MongoDB with Node.js is an essential skill for any contemporary web developer.<\/p>\n<p>In this comprehensive guide, we will walk you through every step of the integration process\u2014from setting up your development environment and choosing the right database driver to performing CRUD operations, modeling your data with Mongoose, and deploying a robust application. We will also cover best practices for error handling, performance optimization, and security. By the end of this tutorial, you will not only know how to connect Node.js to MongoDB but also how to build production\u2011ready applications that take full advantage of both technologies. Let&#8217;s dive in.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/via.placeholder.com\/800x600\/4a90d9\/ffffff?text=how%20to%20use%20MongoDB%20with%20Node.js\" alt=\"Article illustration\" style=\"display:block;margin:20px auto;max-width:100%;height:auto;border-radius:8px;\" \/><\/p>\n<h2>1. Setting Up Your Development Environment<\/h2>\n<p>Before you can start writing code, you need to have Node.js and MongoDB installed on your machine. If you haven&#8217;t already, go to the <a href=\"https:\/\/nodejs.org\" target=\"_blank\">official Node.js website<\/a> and download the LTS version (the stable, long\u2011term support release). The installer will also include <code>npm<\/code> (Node Package Manager), which you will use to install libraries like the MongoDB driver or Mongoose. Once installation is complete, verify the installation by opening a terminal and typing <code>node -v<\/code> and <code>npm -v<\/code>. You should see version numbers for both.<\/p>\n<p>For MongoDB, you have two main options: install MongoDB Community Edition locally or use MongoDB Atlas, the official cloud\u2011based service. Local installation is great for development and learning, but for production you will likely use Atlas. To install locally, follow the instructions for your operating system on the <a href=\"https:\/\/docs.mongodb.com\/manual\/installation\/\" target=\"_blank\">MongoDB documentation<\/a>. After installation, start the MongoDB server by running <code>mongod<\/code> in your terminal (on some systems you may need to use <code>sudo<\/code> or run it as a service). Alternatively, if you prefer a cloud setup, create a free cluster on <a href=\"https:\/\/www.mongodb.com\/cloud\/atlas\" target=\"_blank\">MongoDB Atlas<\/a>. You will get a connection string that looks something like <code>mongodb+srv:\/\/&lt;username&gt;:&lt;password&gt;@cluster0.xxxxx.mongodb.net\/myFirstDatabase?retryWrites=true&w=majority<\/code>. Keep this string safe \u2013 you will use it later in your Node.js code.<\/p>\n<p>Once both Node.js and MongoDB are ready, create a new project folder and initialize it with <code>npm init -y<\/code>. This will generate a <code>package.json<\/code> file that will track your dependencies. Now you are ready to install the necessary packages.<\/p>\n<h2>2. Choosing and Installing a MongoDB Driver<\/h2>\n<p>In the Node.js ecosystem, there are two primary ways to interact with MongoDB: the official <strong>MongoDB Node.js driver<\/strong> and the popular ODM (Object Document Mapper) called <strong>Mongoose<\/strong>. The official driver gives you low\u2011level access to the database, allowing you to execute queries exactly as you would in the MongoDB shell. Mongoose, on the other hand, provides a higher\u2011level abstraction with schema validation, middleware, and a more intuitive API for modeling your data. For beginners and for applications that require strong data validation, Mongoose is often the better choice. For performance\u2011critical applications where you need absolute control over every query, the native driver may be preferable.<\/p>\n<table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>MongoDB Node.js Driver<\/th>\n<th>Mongoose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Abstraction level<\/td>\n<td>Low\u2011level \u2013 write raw queries<\/td>\n<td>High\u2011level \u2013 schema &amp; model based<\/td>\n<\/tr>\n<tr>\n<td>Schema validation<\/td>\n<td>None (must validate manually)<\/td>\n<td>Built\u2011in with type casting<\/td>\n<\/tr>\n<tr>\n<td>Middleware (hooks)<\/td>\n<td>Not available<\/td>\n<td>Pre\/Post hooks for operations<\/td>\n<\/tr>\n<tr>\n<td>Population (joins)<\/td>\n<td>Manual aggregation ($lookup)<\/td>\n<td><code>.populate()<\/code> for relations<\/td>\n<\/tr>\n<tr>\n<td>Learning curve<\/td>\n<td>Steeper (need to know MongoDB query syntax)<\/td>\n<td>Gentler for beginners<\/td>\n<\/tr>\n<tr>\n<td>Performance<\/td>\n<td>Slightly faster (less overhead)<\/td>\n<td>Very close, minimal overhead<\/td>\n<\/tr>\n<tr>\n<td>Use case<\/td>\n<td>Micro\u2011services, high\u2011throughput systems<\/td>\n<td>Rapid prototyping, complex schemas<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For this tutorial, we will use <strong>Mongoose<\/strong> because of its convenience, but I will also point out the equivalent driver methods where applicable. Install Mongoose by running the following command in your project folder:<\/p>\n<pre><code>npm install mongoose<\/code><\/pre>\n<p>If you prefer the native driver, you would install it with <code>npm install mongodb<\/code>. We will now proceed with Mongoose.<\/p>\n<h2>3. Connecting to MongoDB from Node.js<\/h2>\n<p>Create a file called <code>index.js<\/code> (or <code>app.js<\/code>) in your project root. The first step is to import Mongoose and establish a connection to your MongoDB instance. With Mongoose, you use the <code>mongoose.connect()<\/code> method, passing the connection URI and an optional options object. For a local MongoDB server running on the default port (27017), your connection string would be <code>mongodb:\/\/localhost:27017\/myDatabase<\/code>. For MongoDB Atlas, use the string you obtained from the Atlas dashboard.<\/p>\n<pre><code>const mongoose = require('mongoose');\n\nmongoose.connect('mongodb:\/\/localhost:27017\/myDatabase')\n  .then(() => console.log('Connected to MongoDB!'))\n  .catch(err => console.error('Connection error:', err));\n<\/code><\/pre>\n<p>It is highly recommended to store the connection string in an environment variable (e.g., <code>MONGODB_URI<\/code>) rather than hardcoding it, especially when pushing code to a remote repository. You can use the <code>dotenv<\/code> package to load environment variables from a <code>.env<\/code> file. Install it with <code>npm install dotenv<\/code>, create a <code>.env<\/code> file with <code>MONGODB_URI=your_connection_string<\/code>, and then call <code>require('dotenv').config()<\/code> at the top of your entry file. This practice keeps sensitive credentials out of your source code.<\/p>\n<p>Once connected, Mongoose maintains a default connection pool (default size of 100) that you can configure via the <code>mongoose.connect()<\/code> options. For most applications, the default settings are sufficient, but you can tweak them for higher concurrency. After connecting, you can access the database and start defining models.<\/p>\n<h2>4. Defining a Data Schema and Model (CRUD Preparation)<\/h2>\n<p>One of the biggest advantages of using Mongoose over the native driver is the ability to define a schema. A schema specifies the structure of the documents in a collection, including field names, types, default values, and validation rules. For example, if you are building a blog application, you might have a <code>Post<\/code> collection with fields like <code>title<\/code>, <code>content<\/code>, <code>author<\/code>, <code>createdAt<\/code>, etc. Here is how you define such a schema with Mongoose:<\/p>\n<pre><code>const mongoose = require('mongoose');\n\nconst postSchema = new mongoose.Schema({\n  title: {\n    type: String,\n    required: [true, 'Title is required'],\n    trim: true,\n    minlength: [3, 'Title must be at least 3 characters']\n  },\n  content: {\n    type: String,\n    required: true\n  },\n  author: {\n    type: String,\n    required: true\n  },\n  category: {\n    type: String,\n    enum: ['tech', 'lifestyle', 'travel'],\n    default: 'tech'\n  },\n  createdAt: {\n    type: Date,\n    default: Date.now\n  },\n  updatedAt: {\n    type: Date,\n    default: Date.now\n  }\n});\n\n\/\/ Add a pre-save hook to update the updatedAt field\npostSchema.pre('save', function(next) {\n  this.updatedAt = Date.now();\n  next();\n});\n\nmodule.exports = mongoose.model('Post', postSchema);\n<\/code><\/pre>\n<p>After you have defined the schema, you compile it into a <strong>Model<\/strong> using <code>mongoose.model()<\/code>. The model provides an interface for querying, creating, updating, and deleting documents in the corresponding MongoDB collection \u2013 in this case, the collection will be named <code>posts<\/code> (Mongoose automatically pluralizes and lowercases the model name). Now you are ready to perform CRUD operations.<\/p>\n<h2>5. Performing CRUD Operations<\/h2>\n<p>CRUD stands for Create, Read, Update, and Delete. Let&#8217;s go through each operation with concrete examples using the <code>Post<\/code> model we just created.<\/p>\n<h3>Create (Insert) a Document<\/h3>\n<p>To create a new document, you instantiate the model and call <code>.save()<\/code>, or use the static <code>.create()<\/code> method.<\/p>\n<pre><code>\/\/ Using .create()\nconst newPost = await Post.create({\n  title: 'Getting Started with MongoDB',\n  content: 'MongoDB is a NoSQL database...',\n  author: 'Jane Doe',\n  category: 'tech'\n});\nconsole.log('Post created:', newPost);\n<\/code><\/pre>\n<h3>Read (Find) Documents<\/h3>\n<p>Mongoose provides many methods for querying documents: <code>find()<\/code>, <code>findById()<\/code>, <code>findOne()<\/code>, etc. You can also chain query helpers like <code>.sort()<\/code>, <code>.limit()<\/code>, <code>.select()<\/code>.<\/p>\n<pre><code>\/\/ Find all posts in the tech category\nconst techPosts = await Post.find({ category: 'tech' }).sort({ createdAt: -1 }).limit(10);\nconsole.log(techPosts);\n\n\/\/ Find a single post by its ID\nconst post = await Post.findById('609c1b2e8f5f7a1a2c3d4e5f');\nconsole.log(post);\n<\/code><\/pre>\n<h3>Update a Document<\/h3>\n<p>Updating can be done with <code>updateOne()<\/code>, <code>findByIdAndUpdate()<\/code>, or <code>findOneAndUpdate()<\/code>. For example, to change the content of a post:<\/p>\n<pre><code>const updatedPost = await Post.findByIdAndUpdate(\n  '609c1b2e8f5f7a1a2c3d4e5f',\n  { content: 'Updated content', updatedAt: Date.now() },\n  { new: true, runValidators: true }\n);\nconsole.log('Updated post:', updatedPost);\n<\/code><\/pre>\n<p>The <code>{ new: true }<\/code> option returns the updated document; without it, Mongoose returns the original document. <code>runValidators: true<\/code> ensures that any schema validations (like minlength) are applied to the update.<\/p>\n<h3>Delete a Document<\/h3>\n<p>Deleting a document is straightforward using <code>deleteOne()<\/code>, <code>findByIdAndDelete()<\/code>, or <code>findOneAndDelete()<\/code>.<\/p>\n<pre><code>const result = await Post.findByIdAndDelete('609c1b2e8f5f7a1a2c3d4e5f');\nif (result) {\n  console.log('Post deleted successfully');\n} else {\n  console.log('Post not found');\n}\n<\/code><\/pre>\n<p>These four operations are the backbone of any database interaction. Using Mongoose, each operation can be augmented with middleware (pre\/post hooks) and custom validation, making your data layer both expressive and robust.<\/p>\n<table>\n<thead>\n<tr>\n<th>Operation<\/th>\n<th>Mongoose Method<\/th>\n<th>Native Driver Equivalent<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Create<\/td>\n<td><code>Model.create()<\/code> or <code>new Model().save()<\/code><\/td>\n<td><code>collection.insertOne()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Read<\/td>\n<td><code>Model.find()<\/code>, <code>Model.findById()<\/code>, <code>Model.findOne()<\/code><\/td>\n<td><code>collection.find()<\/code>, <code>collection.findOne()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Update<\/td>\n<td><code>Model.updateOne()<\/code>, <code>Model.findByIdAndUpdate()<\/code><\/td>\n<td><code>collection.updateOne()<\/code><\/td>\n<\/tr>\n<tr>\n<td>Delete<\/td>\n<td><code>Model.deleteOne()<\/code>, <code>Model.findByIdAndDelete()<\/code><\/td>\n<td><code>collection.deleteOne()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>6. Building a Simple REST API with Express and MongoDB<\/h2>\n<p>Now that you understand the fundamentals of CRUD, let&#8217;s integrate everything into a small REST API using Express. First, install Express: <code>npm install express<\/code>. Create a new file called <code>server.js<\/code> and set up a basic Express application that uses our <code>Post<\/code> model.<\/p>\n<pre><code>const express = require('express');\nconst mongoose = require('mongoose');\nconst Post = require('.\/models\/Post'); \/\/ assuming you saved the model in models\/Post.js\n\nconst app = express();\napp.use(express.json()); \/\/ parse JSON bodies\n\n\/\/ Connect to MongoDB\nmongoose.connect(process.env.MONGODB_URI || 'mongodb:\/\/localhost:27017\/blog')\n  .then(() => console.log('MongoDB connected'))\n  .catch(err => console.error(err));\n\n\/\/ GET \/posts - retrieve all posts\napp.get('\/posts', async (req, res) => {\n  try {\n    const posts = await Post.find().sort({ createdAt: -1 });\n    res.json(posts);\n  } catch (err) {\n    res.status(500).json({ message: err.message });\n  }\n});\n\n\/\/ POST \/posts - create a new post\napp.post('\/posts', async (req, res) => {\n  const post = new Post({\n    title: req.body.title,\n    content: req.body.content,\n    author: req.body.author,\n    category: req.body.category\n  });\n  try {\n    const newPost = await post.save();\n    res.status(201).json(newPost);\n  } catch (err) {\n    res.status(400).json({ message: err.message });\n  }\n});\n\n\/\/ PUT \/posts\/:id - update a post\napp.put('\/posts\/:id', async (req, res) => {\n  try {\n    const updatedPost = await Post.findByIdAndUpdate(\n      req.params.id,\n      req.body,\n      { new: true, runValidators: true }\n    );\n    if (!updatedPost) return res.status(404).json({ message: 'Post not found' });\n    res.json(updatedPost);\n  } catch (err) {\n    res.status(400).json({ message: err.message });\n  }\n});\n\n\/\/ DELETE \/posts\/:id - delete a post\napp.delete('\/posts\/:id', async (req, res) => {\n  try {\n    const post = await Post.findByIdAndDelete(req.params.id);\n    if (!post) return res.status(404).json({ message: 'Post not found' });\n    res.json({ message: 'Post deleted' });\n  } catch (err) {\n    res.status(500).json({ message: err.message });\n  }\n});\n\nconst PORT = process.env.PORT || 3000;\napp.listen(PORT, () => console.log(`Server running on port ${PORT}`));\n<\/code><\/pre>\n<p>This simple API demonstrates how to wire up Express routes with Mongoose CRUD operations. Notice that we wrap every async route handler in a try\u2011catch block and send appropriate HTTP status codes \u2013 a practice that is essential for building reliable APIs. You can test the endpoints using tools like Postman or cURL.<\/p>\n<h2>7. Error Handling and Connection Management Best Practices<\/h2>\n<p>When your application runs in production, it&#8217;s crucial to handle database connection errors gracefully and to implement connection retry logic. Mongoose events like <code>error<\/code> and <code>disconnected<\/code> should be monitored. For example, you can add:<\/p>\n<pre><code>mongoose.connection.on('error', err => {\n  console.error('MongoDB connection error:', err);\n});\n\nmongoose.connection.on('disconnected', () => {\n  console.log('MongoDB disconnected, attempting to reconnect...');\n});\n<\/code><\/pre>\n<p>If the connection drops, Mongoose will automatically try to reconnect, but you may want to terminate the process or notify a monitoring service after a certain number of retries. Additionally, always close the Mongoose connection gracefully when your Node.js process is terminated (e.g., using <code>process.on('SIGINT', ...)<\/code>).<\/p>\n<p>For error handling in your Express routes, consider using a centralized error\u2011handling middleware instead of wrapping every route individually. That keeps your code cleaner and more maintainable. Also, never expose internal error details to the client in production \u2013 return only a generic message and log the full error server\u2011side.<\/p>\n<h2>Tips and Best Practices<\/h2>\n<h3>1. Always Use Environment Variables for Configuration<\/h3>\n<p>Hardcoding connection strings, database names, and other sensitive data is a security risk and makes it difficult to deploy to multiple environments (development, staging, production). Use packages like <code>dotenv<\/code> and store all configuration in a <code>.env<\/code> file that is never committed to version control. This also lets you easily switch between a local MongoDB and an Atlas cluster without modifying your code.<\/p>\n<h3>2. Enable Indexes for Performance<\/h3>\n<p>MongoDB performs best when queries are supported by appropriate indexes. Mongoose allows you to define indexes in your schema. For example, if you frequently query posts by <code>author<\/code>, add an index: <code>author: { type: String, index: true }<\/code>. You can also create compound indexes for queries that filter on multiple fields. Use <code>.explain()<\/code> to analyze query performance during development.<\/p>\n<h3>3. Use Connection Pooling and Replica Sets in Production<\/h3>\n<p>By default, Mongoose uses a connection pool with 100 connections. This is sufficient for many applications, but for high\u2011traffic scenarios you may want to tune the <code>poolSize<\/code> option. In production, always deploy MongoDB as a replica set (even if you have only one node) to enable automatic failover and data durability. Atlas automatically configures replica sets for you.<\/p>\n<h2>Frequently Asked Questions (FAQ)<\/h2>\n<h3>Q1: What is the difference between the MongoDB Node.js driver and Mongoose?<\/h3>\n<p>The native driver is a low\u2011level library that directly maps to MongoDB&#8217;s wire protocol, giving you the most control and performance. Mongoose is an ODM that provides schema validation, middleware, type casting, and a more developer\u2011friendly interface. For most projects, Mongoose speeds up development and reduces bugs, but if you need absolute raw performance or are building a data pipeline that doesn&#8217;t benefit from schemas, the native driver might be a better fit.<\/p>\n<h3>Q2: How do I handle connection failures in production?<\/h3>\n<p>Use Mongoose&#8217;s built\u2011in auto\u2011reconnect feature (enabled by default). Additionally, listen for the <code>error<\/code> event and implement a retry strategy with exponential backoff. In your Express app, wrap database calls in try\u2011catch and return a 503 Service Unavailable if the database is down. You can also health\u2011check the connection at startup and refuse to start the server if the database cannot be reached.<\/p>\n<h3>Q3: Can I use Mongoose with MongoDB Atlas?<\/h3>\n<p>Absolutely! MongoDB Atlas is fully compatible with Mongoose. Simply use the connection string provided by Atlas (make sure to whitelist your IP address and create a database user). Atlas also supports replica sets out of the box, which means your application gains high availability automatically.<\/p>\n<h3>Q4: How do I prevent SQL injection in MongoDB\/Mongoose?<\/h3>\n<p>MongoDB is not vulnerable to traditional SQL injection because it uses a binary protocol, not SQL strings. However, you can still be exposed to NoSQL injection if you directly pass user input into query operators like <code>$where<\/code>, <code>$regex<\/code>, or <code>$ne<\/code>. Always validate and sanitize user input, use Mongoose&#8217;s schema validation to restrict field types, and avoid using <code>$where<\/code> with unsanitized strings. Using Mongoose&#8217;s built\u2011in query building (e.g., <code>User.find({ username: req.body.username })<\/code>) is safe because it parameterizes the input.<\/p>\n<h3>Q5: How do I handle schema migrations in Mongoose?<\/h3>\n<p>Mongoose does not have a built\u2011in migration system like some ORMs. For schema changes, you have several options: (a) use graceful database changes \u2013 for example, add a new field with a default value, then update existing documents in a script; (b) use a migration library like <code>migrate-mongo<\/code>; (c) version your data (e.g., add a <code>version<\/code> field) and handle different shapes in your application code. The best approach depends on the size of your dataset and the frequency of schema changes.<\/p>\n<h2>Conclusion<\/h2>\n<p>Integrating MongoDB with Node.js opens up a world of possibilities for building fast, scalable, and flexible web applications. In this guide, we covered everything from environment setup and driver selection to CRUD operations, REST API construction, and production best practices. You learned how to define schemas with Mongoose, how to perform all four basic data operations, and how to wire them into an Express server. We also discussed important tips such as using environment variables, indexing for performance, and handling errors robustly.<\/p>\n<p>The combination of MongoDB and Node.js is not just a trend \u2013 it is a proven, battle\u2011tested stack used by companies like Uber, eBay, and LinkedIn. By mastering these fundamentals, you are now equipped to build your own data\u2011driven applications with confidence. As next steps, consider exploring advanced Mongoose features like aggregation pipelines, transactions (for multi\u2011document atomicity), and integrating authentication with Passport.js. Remember to always test your database code thoroughly and monitor performance in production. Happy coding!<\/p>\n<p>&#8220;`<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;`html The Ultimate Guide to Using MongoDB with Node.js: From Setup to Production When it comes to building modern, data-driven web applications, few technology stacks are as popular and powerful as MongoDB combined with Node.js. MongoDB provides a flexible, document-oriented NoSQL database that allows you to store data in a JSON-like format, while Node.js offers &hellip; <\/p>\n","protected":false},"author":2716,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-866","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/users\/2716"}],"replies":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/comments?post=866"}],"version-history":[{"count":0,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/866\/revisions"}],"wp:attachment":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/media?parent=866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/categories?post=866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/tags?post=866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}