<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Prayush Adhikari</title>
    <description>The latest articles on DEV Community by Prayush Adhikari (@adhikareeprayush).</description>
    <link>https://dev.to/adhikareeprayush</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1274304%2Faa3fb343-42dd-4a94-b45d-672b8ad1c0af.jpg</url>
      <title>DEV Community: Prayush Adhikari</title>
      <link>https://dev.to/adhikareeprayush</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adhikareeprayush"/>
    <language>en</language>
    <item>
      <title>MongoDB: Zero to Advanced (The Real Guide Nobody Else Will Write)</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Tue, 24 Feb 2026 08:14:10 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/mongodb-zero-to-advanced-the-real-guide-nobody-else-will-write-em5</link>
      <guid>https://dev.to/adhikareeprayush/mongodb-zero-to-advanced-the-real-guide-nobody-else-will-write-em5</guid>
      <description>&lt;p&gt;Hey there! So you've heard about MongoDB and now you're wondering what the heck it actually is and why everyone keeps talking about it. I've been down this rabbit hole and I'm going to save you from the confusion, the bad tutorials, and the Stack Overflow rabbit holes.&lt;/p&gt;

&lt;p&gt;This is the guide I wish existed when I started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's Talk About Databases First (Bear With Me)
&lt;/h2&gt;

&lt;p&gt;Before we jump into MongoDB, we need to talk about what a database actually is. And no, I'm not going to give you the boring textbook definition.&lt;/p&gt;

&lt;p&gt;Think of it this way: you're building a web app. You have users, their profiles, their posts, their comments. Where does all this data live when you close your laptop? Not in your code. Not in RAM. It lives in a &lt;strong&gt;database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A database is just an organized way to store, retrieve, and manage data. That's it. No magic.&lt;/p&gt;

&lt;p&gt;Now here's where it gets interesting. There are two main types of databases and understanding the difference is going to save you a LOT of confusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQL vs NoSQL: The Fight That Never Ends
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SQL databases&lt;/strong&gt; (PostgreSQL, MySQL, SQLite) are like super strict spreadsheets. You define the columns upfront, every row must follow the same structure, and everything is neatly organized in tables. Want to change the structure? Hope you like writing migration scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NoSQL databases&lt;/strong&gt; (MongoDB being the king here) are more like a folder full of documents. Each document can look completely different from the others. Some can have 5 fields, some can have 50. Nobody's going to yell at you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd3kr2pwtcgfqntyn3z1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd3kr2pwtcgfqntyn3z1b.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So when should you use MongoDB? Here's my honest take:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building a modern web or mobile app&lt;/li&gt;
&lt;li&gt;Your data structure might change a lot (early stage projects)&lt;/li&gt;
&lt;li&gt;You need to store nested or complex data (like a user profile with embedded addresses and preferences)&lt;/li&gt;
&lt;li&gt;You want to move fast without worrying about schema migrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When should you NOT use MongoDB? If you're dealing with super complex relationships and need a lot of joins (think banking systems, ERPs), a relational database might serve you better. MongoDB added transactions and lookup operations, but SQL databases still shine there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up MongoDB (The Easy Way)
&lt;/h2&gt;

&lt;p&gt;Forget local installation for now. Seriously. The number of people who've given up on MongoDB because of installation headaches is criminal.&lt;/p&gt;

&lt;p&gt;We're using &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; — it's free, it's cloud-based, and it's exactly what real companies use in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create Your Atlas Account
&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://www.mongodb.com/products/platform/atlas-database" rel="noopener noreferrer"&gt;mongodb.com/products/platform/atlas-database&lt;/a&gt; and sign up. It's free. No credit card needed for the free tier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcro05r5fnym76r3owj9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcro05r5fnym76r3owj9k.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create Your First Cluster
&lt;/h3&gt;

&lt;p&gt;Once you're in, click &lt;strong&gt;"Build a Database"&lt;/strong&gt; and choose the &lt;strong&gt;M0 Free&lt;/strong&gt; option. Pick whichever cloud provider and region is closest to you. Name your cluster whatever you want — I usually just call it &lt;code&gt;MyCluster&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv4lwz6uwwxkt5w7tb59w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv4lwz6uwwxkt5w7tb59w.png" alt=" " width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set Up Access
&lt;/h3&gt;

&lt;p&gt;Atlas will ask you to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a database user (username + password — save these!)&lt;/li&gt;
&lt;li&gt;Your current IP address will be added as the part of auto setup process. (If not head to Database and Network access menu from sidebar you will find the way)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Get Your Connection String
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Connect&lt;/strong&gt; on your cluster → &lt;strong&gt;Connect using MongoDB Compass&lt;/strong&gt; or &lt;strong&gt;Connect your application&lt;/strong&gt;. Copy that connection string. You'll need it later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Install MongoDB Compass
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.mongodb.com/products/compass" rel="noopener noreferrer"&gt;MongoDB Compass&lt;/a&gt; is the GUI for MongoDB. It lets you visually browse your data, run queries, and manage collections without writing a single line of code. This is your new best friend.&lt;/p&gt;

&lt;p&gt;Download it, install it, paste your connection string, and hit connect. You're in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqjmt9w0lyqvwkh2v60q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqjmt9w0lyqvwkh2v60q.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Concepts: The Building Blocks
&lt;/h2&gt;

&lt;p&gt;Alright, let's get into the actual meat of MongoDB. There are 4 things you need to understand before anything else makes sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Database
&lt;/h3&gt;

&lt;p&gt;A database in MongoDB is exactly what it sounds like — a container for your data. Think of it like a project folder. If you're building a blog app, you'd probably have a &lt;code&gt;blog&lt;/code&gt; database.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Collection
&lt;/h3&gt;

&lt;p&gt;A collection is like a table in SQL — except it has no fixed structure. It holds a bunch of documents. In your &lt;code&gt;blog&lt;/code&gt; database, you might have a &lt;code&gt;posts&lt;/code&gt; collection and a &lt;code&gt;users&lt;/code&gt; collection.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Document
&lt;/h3&gt;

&lt;p&gt;This is where MongoDB gets cool. A document is a single record — like a row in SQL — but it's stored as &lt;strong&gt;JSON-like format called BSON&lt;/strong&gt;. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"64f3a1b2c3d4e5f6a7b8c9d0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Prayush Adhikari"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prayush@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"JavaScript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MongoDB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Linux"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kathmandu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nepal"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See that? An array inside a document. An object inside a document. This flexibility is what makes MongoDB powerful.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;_id&lt;/code&gt; Field
&lt;/h3&gt;

&lt;p&gt;Every document in MongoDB gets a unique &lt;code&gt;_id&lt;/code&gt; field automatically. MongoDB generates it as an &lt;strong&gt;ObjectId&lt;/strong&gt; unless you provide your own. It looks ugly but it's your document's unique fingerprint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp8tlgrq7m4wo4bubii4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp8tlgrq7m4wo4bubii4.png" alt=" " width="800" height="763"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  CRUD Operations: The Heart of Everything
&lt;/h2&gt;

&lt;p&gt;CRUD stands for &lt;strong&gt;Create, Read, Update, Delete&lt;/strong&gt;. If you master these four operations, you can build basically anything with MongoDB.&lt;/p&gt;

&lt;p&gt;I'll show you both the shell commands (&lt;code&gt;mongosh&lt;/code&gt;) and what they look like in Compass so you get the full picture. First create a database and a collection using the gui. I am creating the database named &lt;code&gt;myDatabase&lt;/code&gt; and collection named &lt;code&gt;users&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create: Adding Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// use the created database&lt;/span&gt;
&lt;span class="nx"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;myDatabase&lt;/span&gt;

&lt;span class="c1"&gt;// Insert a single document&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prayush@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;joined&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Insert multiple documents at once&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertMany&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alice@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bob@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukhaekqy0mgwzh7losks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukhaekqy0mgwzh7losks.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Read: Finding Data
&lt;/h3&gt;

&lt;p&gt;This is where you'll spend most of your time, so pay attention.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Find ALL documents in a collection&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Find documents that match a condition&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Find one specific document&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prayush@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Find users older than 20&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Find users and only return name and email (projection)&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Sort by age ascending&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Limit to 5 results&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those &lt;code&gt;$gt&lt;/code&gt;, &lt;code&gt;$lt&lt;/code&gt;, &lt;code&gt;$gte&lt;/code&gt; things are called &lt;strong&gt;query operators&lt;/strong&gt; and they're incredibly powerful. Here's a quick cheat sheet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$gt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Greater than&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ age: { $gt: 18 } }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$lt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Less than&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ age: { $lt: 65 } }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$gte&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Greater than or equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ age: { $gte: 21 } }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$lte&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Less than or equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ score: { $lte: 100 } }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$ne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not equal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ status: { $ne: "banned" } }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$in&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;In an array of values&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ role: { $in: ["admin", "mod"] } }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3sxc12gdfka5a89vnpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3sxc12gdfka5a89vnpo.png" alt=" " width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Update: Changing Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Update ONE document&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;          &lt;span class="c1"&gt;// Filter: find this document&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;         &lt;span class="c1"&gt;// What to change&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Update MULTIPLE documents&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$lt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;minor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Increment a value&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$inc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;loginCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="c1"&gt;// Adds 1 to loginCount&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Add item to an array&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Docker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;$set&lt;/code&gt;, &lt;code&gt;$inc&lt;/code&gt;, &lt;code&gt;$push&lt;/code&gt; are called &lt;strong&gt;update operators&lt;/strong&gt;. NEVER update a document without using these operators — if you skip them, you'll overwrite the entire document and lose all your data. Ask me how I know.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delete: Removing Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Delete ONE document&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Delete MULTIPLE documents&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteMany&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$lt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Delete ALL documents in a collection (use carefully!)&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteMany&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffevrdvt4n6j8vor2jcjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffevrdvt4n6j8vor2jcjh.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Data Modeling: The Part That Actually Matters
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody tells beginners — getting your data model right is more important than knowing all the fancy MongoDB features. A bad data model will haunt you for the entire life of your project.&lt;/p&gt;

&lt;p&gt;In MongoDB, you have two ways to relate data: &lt;strong&gt;embedding&lt;/strong&gt; and &lt;strong&gt;referencing&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Embedding (Nesting Data Inside a Document)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Prayush"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123 Kathmandu St"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kathmandu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"zip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"44600"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Keyboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use embedding when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The embedded data is always accessed with the parent (you always need the address when you get the user)&lt;/li&gt;
&lt;li&gt;The embedded data doesn't change often&lt;/li&gt;
&lt;li&gt;The array won't grow unboundedly (don't embed 10,000 comments in a blog post)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Referencing (Like Foreign Keys in SQL)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;users&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;collection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Prayush"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;posts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;collection&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"post456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My MongoDB Guide"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"authorId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;References&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;user&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use referencing when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The data is frequently updated independently&lt;/li&gt;
&lt;li&gt;The data is shared across many documents&lt;/li&gt;
&lt;li&gt;The array could grow very large&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjf0ug43ew7pl9i0043h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjf0ug43ew7pl9i0043h.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My rule of thumb: &lt;strong&gt;embed for read-heavy relationships, reference for write-heavy or large growing relationships.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Intermediate Queries: Leveling Up
&lt;/h2&gt;

&lt;p&gt;Now that you know the basics, let's get into some more powerful queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Querying Arrays
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Find users who have "MongoDB" in their skills array&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MongoDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Find users who have BOTH "MongoDB" AND "JavaScript"&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MongoDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Find users where at least one skill matches a condition&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
  &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$elemMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$eq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Docker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Querying Nested/Embedded Documents
&lt;/h3&gt;

&lt;p&gt;Use dot notation to query inside nested objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Find users in Kathmandu&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address.city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kathmandu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Find orders over $100 within user documents&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orders.price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Logical Operators
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AND: find users who are 21 AND from Kathmandu&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
  &lt;span class="na"&gt;$and&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;address.city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kathmandu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// OR: find users who are admins OR moderators&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;$or&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;moderator&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// NOT: find users who are NOT banned&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$not&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$eq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;banned&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Aggregation Framework: Where the Real Magic Happens
&lt;/h2&gt;

&lt;p&gt;This is the part that separates beginners from intermediate developers. The aggregation framework lets you process and transform your data through a &lt;strong&gt;pipeline&lt;/strong&gt; of stages.&lt;/p&gt;

&lt;p&gt;Think of it like a factory assembly line — your data goes in one end, gets processed at each stage, and comes out transformed on the other end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="c1"&gt;// Stage 1: Filter (like find)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Stage 2: Group by category and sum revenue&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$category&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;totalRevenue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$sum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;orderCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$sum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}},&lt;/span&gt;

  &lt;span class="c1"&gt;// Stage 3: Sort by revenue descending&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$sort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;totalRevenue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// Stage 4: Only return top 5&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pipeline would give you the top 5 product categories by revenue. Try doing that with just &lt;code&gt;find()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Aggregation Stages
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$match&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filter documents (like &lt;code&gt;find&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Group documents and compute values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$sort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sort results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Include/exclude/transform fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cap the number of results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$unwind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deconstruct an array into separate documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$lookup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Join with another collection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Real Example: Blog Stats
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Get total posts and average views per author&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$authorId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;totalPosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$sum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;avgViews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$avg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$views&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;totalViews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$sum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$views&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$sort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;totalViews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feao762d0yk4xdn088l96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feao762d0yk4xdn088l96.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Indexing: Making Your Database Fast
&lt;/h2&gt;

&lt;p&gt;Here's a fact: without indexes, MongoDB scans EVERY document in a collection to find matches. That's fine when you have 100 documents. It's catastrophic when you have 10 million.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;index&lt;/strong&gt; is like the index at the back of a textbook — instead of reading every page to find "MongoDB," you look at the index, get the page number, and jump straight there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create an index on the email field&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createIndex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;   &lt;span class="c1"&gt;// 1 = ascending, -1 = descending&lt;/span&gt;

&lt;span class="c1"&gt;// Create a compound index (on multiple fields)&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createIndex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Create a unique index (no duplicate emails!)&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createIndex&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Check existing indexes&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getIndexes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// See how MongoDB executes a query (is it using an index?)&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prayush@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;executionStats&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Add an Index
&lt;/h3&gt;

&lt;p&gt;Add indexes on fields that you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query frequently (filters, search)&lt;/li&gt;
&lt;li&gt;Sort on often&lt;/li&gt;
&lt;li&gt;Use in joins/lookups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't add indexes on everything — they take up space and slow down writes. Index what you query. That's the rule.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfm5q33wfrtvxokxjeof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfm5q33wfrtvxokxjeof.png" alt=" " width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Transactions: When You Need ACID Guarantees
&lt;/h2&gt;

&lt;p&gt;Here's something that surprises a lot of people: MongoDB supports multi-document transactions since version 4.0. Yes, the same kind of transactions you get in PostgreSQL.&lt;/p&gt;

&lt;p&gt;This matters when you need multiple operations to either ALL succeed or ALL fail. Classic example: transferring money between two accounts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startSession&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accounts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;updateOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$inc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;accounts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;updateOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$inc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commitTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Transfer successful!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abortTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Transfer failed. Rolled back.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endSession&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the second update fails, the first one is automatically rolled back. No partial transfers. No corrupted data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connecting MongoDB to Node.js (Let's Build Something Real)
&lt;/h2&gt;

&lt;p&gt;Theory is cool but let's actually use this thing. Here's how to connect MongoDB to a Node.js app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;mongo-demo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;mongo-demo
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;mongodb dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MONGODB_URI=your_connection_string_from_atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Basic Connection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// db.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MongoClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;connectDB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MongoClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGODB_URI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Connected to MongoDB!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connectDB&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building a Simple CRUD API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connectDB&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;connectDB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;db&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blogDB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;posts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// CREATE&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My First Post&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MongoDB is actually pretty cool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;views&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongodb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Created:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newPost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertedId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// READ&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Posts:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;allPosts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// UPDATE&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newPost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertedId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$inc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;views&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// DELETE&lt;/span&gt;
  &lt;span class="c1"&gt;// await posts.deleteOne({ _id: newPost.insertedId });&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfq8bgmkv2angox26a08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfq8bgmkv2angox26a08.png" alt=" " width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Mongoose: The Better Way to Use MongoDB with Node.js
&lt;/h2&gt;

&lt;p&gt;If you're building a real app with Node.js, you'll want to use &lt;strong&gt;Mongoose&lt;/strong&gt; instead of the raw MongoDB driver. Mongoose adds schema validation, middleware, and a bunch of quality-of-life features.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;mongoose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Define a schema&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;views&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Create a model&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;postSchema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Connect and use&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGODB_URI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Create&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mongoose is Great&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Schema validation saves lives&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Find&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prayush&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The big win with Mongoose? If you try to save a document without a required field, it throws an error before it even hits the database. That's validation at the schema level.&lt;/p&gt;




&lt;h2&gt;
  
  
  Atlas Search and Vector Search: The 2025-2026 Stuff
&lt;/h2&gt;

&lt;p&gt;This is where MongoDB gets genuinely exciting for modern applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atlas Search
&lt;/h3&gt;

&lt;p&gt;Built on Apache Lucene, Atlas Search lets you add full-text search to your app without spinning up a separate Elasticsearch instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Full-text search on posts&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;$search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongodb tutorial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vector Search (For AI Apps)
&lt;/h3&gt;

&lt;p&gt;If you're building RAG applications or any AI-powered feature that needs semantic search, MongoDB Atlas Vector Search is a game changer. You store embeddings (vectors from AI models) right alongside your data and query by similarity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Search for semantically similar documents&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;$vectorSearch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vector_index&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;embedding&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;queryVector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...],&lt;/span&gt;  &lt;span class="c1"&gt;// Your query embedding&lt;/span&gt;
      &lt;span class="na"&gt;numCandidates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the technology that powers modern AI chatbots that can "remember" things from documents. MongoDB lets you build this without stitching together 5 different services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Time Series Collections (MongoDB 8.x)
&lt;/h2&gt;

&lt;p&gt;Got IoT data? Logs? Metrics? MongoDB 8.x introduced optimized time series collections that store time-based data WAY more efficiently than regular collections.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create a time series collection&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sensorData&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;timeseries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;timeField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timestamp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;metaField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sensorId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;granularity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;seconds&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Insert time series data&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sensorData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertMany&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;sensorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sensor1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;23.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;sensorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sensor2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;25.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MongoDB automatically handles compression and optimized storage for you. This stuff used to require specialized databases like InfluxDB. Now MongoDB handles it natively.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Secret to MongoDB Mastery
&lt;/h2&gt;

&lt;p&gt;Here's what nobody tells you: knowing all the commands is the easy part. The hard part is &lt;strong&gt;knowing which tool to reach for&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every concept I've covered comes down to one question: what is the most efficient way to store and retrieve THIS specific data for THIS specific use case?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedding vs referencing is a design decision, not a rule.&lt;/li&gt;
&lt;li&gt;Indexes are solutions to performance problems, not defaults you add to everything.&lt;/li&gt;
&lt;li&gt;Aggregations are for analytics and transformations, not for basic reads.&lt;/li&gt;
&lt;li&gt;Transactions are for when correctness absolutely cannot be compromised.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start building something. A blog. A todo app. A movie tracker. Break it. Fix it. Look at your slow queries. Add indexes. Refactor your data model when it starts hurting. That's how you actually learn MongoDB.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Here are some things I'd cover in separate deep dives if you want me to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full REST API with Express + MongoDB&lt;/strong&gt; — Let's build it properly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication system with MongoDB&lt;/strong&gt; — JWT, sessions, the whole thing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharding and scaling&lt;/strong&gt; — When your app hits a million users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Change Streams&lt;/strong&gt; — Real-time notifications without polling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlas Triggers and Functions&lt;/strong&gt; — Serverless functions that react to database events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment with which one you want first and I'll get to it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;I'm &lt;strong&gt;Prayush Adhikari&lt;/strong&gt;, grinding through computer engineering and writing content that actually helps. If this guide saved you from a bad tutorial or a confusing Stack Overflow thread, we're even.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://linkedin.com/in/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What do you want me to cover next? Drop it in the comments.&lt;/p&gt;

&lt;p&gt;Now go build something with MongoDB.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>mongodb</category>
      <category>database</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Database Indexing Explained Like You're 5 (Then Like You're a Senior Dev)</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Wed, 12 Nov 2025 19:51:22 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/database-indexing-explained-like-youre-5-then-like-youre-a-senior-dev-57hc</link>
      <guid>https://dev.to/adhikareeprayush/database-indexing-explained-like-youre-5-then-like-youre-a-senior-dev-57hc</guid>
      <description>&lt;p&gt;Hey there! So you want to understand database indexing? Cool. Let me break this down in a way that actually makes sense, starting from the absolute basics and working our way up to the stuff that'll make you look like a genius in your next code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5-Year-Old Explanation
&lt;/h2&gt;

&lt;p&gt;Imagine you have a massive book with 10,000 pages about different animals. No table of contents, no organization, just random animals on random pages.&lt;/p&gt;

&lt;p&gt;Now, your teacher asks: "Find me information about elephants."&lt;/p&gt;

&lt;p&gt;What do you do? You flip through every single page until you find elephants. Page 1, nope. Page 2, nope. Page 3, nope... this is going to take forever, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's your database without indexes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now imagine the same book, but at the front, there's a special page that says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elephants: Page 4,521&lt;/li&gt;
&lt;li&gt;Lions: Page 892&lt;/li&gt;
&lt;li&gt;Penguins: Page 7,234&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Boom. You jump straight to page 4,521. Found it in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's an index.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simple, right? Now let's get into the real stuff.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real World Problem
&lt;/h2&gt;

&lt;p&gt;Let's say you're building an app. Could be anything, a blog, an e-commerce site, whatever. You've got a users table with 1 million records. Someone tries to log in, and you run this query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prayush@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without an index, your database does what's called a &lt;strong&gt;full table scan&lt;/strong&gt;. It literally checks every single one of those 1 million rows. Every. Single. One.&lt;/p&gt;

&lt;p&gt;On my machine, that query took &lt;strong&gt;2.3 seconds&lt;/strong&gt; without an index.&lt;/p&gt;

&lt;p&gt;With an index? &lt;strong&gt;0.003 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, you read that right. From 2.3 seconds to 3 milliseconds. That's not just fast, that's "your users don't rage-quit your app" fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Indexes Actually Work (Getting Technical)
&lt;/h2&gt;

&lt;p&gt;Alright, now we're getting into the good stuff. Let's talk about what's really happening under the hood.&lt;/p&gt;

&lt;h3&gt;
  
  
  The B-Tree Structure
&lt;/h3&gt;

&lt;p&gt;Most databases use something called a B-Tree (Balanced Tree) for indexes. And no, despite what everyone thinks, the B doesn't stand for "binary." It actually stands for "balanced" or possibly "Bayer" (the guy who invented it).&lt;/p&gt;

&lt;p&gt;Here's the deal: a B-Tree organizes your data in a tree structure where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The root node contains pointers to other nodes&lt;/li&gt;
&lt;li&gt;Intermediate nodes contain more pointers&lt;/li&gt;
&lt;li&gt;Leaf nodes contain the actual data (or pointers to the actual data)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you search for something, the database traverses this tree. Instead of checking 1 million rows, it might only need to check 3-4 nodes to find what it's looking for.&lt;/p&gt;

&lt;p&gt;Let me show you what I mean with a real example from a project I worked on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Creating a simple users table&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Insert a million records (not showing the full script here, trust me)&lt;/span&gt;
&lt;span class="c1"&gt;-- Now let's see the difference&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'random@email.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- Seq Scan on users (cost=0.00..25833.00 rows=1 width=89) (actual time=2347.921..2347.922 rows=1 loops=1)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;EXPLAIN&lt;/span&gt; &lt;span class="k"&gt;ANALYZE&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'random@email.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- Index Scan using idx_users_email on users (cost=0.42..8.44 rows=1 width=89) (actual time=0.038..0.039 rows=1 loops=1)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The numbers don't lie. The cost dropped from 25833 to 8.44. That's massive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Indexes (Because One Size Doesn't Fit All)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Single Column Index
&lt;/h3&gt;

&lt;p&gt;The basic one we've been talking about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this when you're frequently searching by a single column.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Composite Index
&lt;/h3&gt;

&lt;p&gt;Multiple columns in one index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_email_username&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's where it gets interesting. The &lt;strong&gt;order matters&lt;/strong&gt;. This index is great for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'x'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'y'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- Fast&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'x'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- Also fast&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'y'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;-- Slow! Doesn't use the index&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why? Because the index is organized by email first, then username. It's like a phone book sorted by last name, then first name. You can't efficiently find someone by just their first name.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Unique Index
&lt;/h3&gt;

&lt;p&gt;Enforces uniqueness AND speeds up queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_unique_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for emails, usernames, or anything that should be unique.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Partial Index
&lt;/h3&gt;

&lt;p&gt;This one's cool. Index only part of your data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_active_users&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you only ever query active users, why index the inactive ones? Save space, save time.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Full-Text Index
&lt;/h3&gt;

&lt;p&gt;For searching text content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_post_content&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what makes your blog search actually work. I use this on my own projects and it's a game changer for search functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dark Side: When Indexes Hurt You
&lt;/h2&gt;

&lt;p&gt;Here's what nobody tells beginners: indexes aren't free. They come with a cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage Cost
&lt;/h3&gt;

&lt;p&gt;Every index is basically a copy of your data in a different structure. More indexes = more disk space. I learned this the hard way when my database size doubled because I got index-happy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write Performance
&lt;/h3&gt;

&lt;p&gt;Every time you INSERT, UPDATE, or DELETE, the database has to update all your indexes too.&lt;/p&gt;

&lt;p&gt;Real talk: I once had a table with 12 indexes. Inserts were taking forever. Dropped it down to 4 strategic indexes, and suddenly my batch inserts went from 5 minutes to 30 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wrong Index Is Worse Than No Index
&lt;/h3&gt;

&lt;p&gt;True story: I once created an index on a column with only 3 possible values (status: pending, active, inactive). The database was spending more time maintaining and reading the index than it would have just scanning the table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; If a column has low cardinality (not many unique values), skip the index.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Indexing Mistakes (Learn from My Pain)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mistake 1: Indexing Everything
&lt;/h3&gt;

&lt;p&gt;I did this. You'll probably do this too. Don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Index based on your actual queries. Use EXPLAIN ANALYZE to see what's slow, then index specifically for that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 2: Ignoring Index Order in Composite Indexes
&lt;/h3&gt;

&lt;p&gt;Remember that email + username example? Put the most selective column first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Bad: username has duplicates, email is unique&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_bad&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Good: email is unique, username has duplicates  &lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_good&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mistake 3: Not Analyzing Your Indexes
&lt;/h3&gt;

&lt;p&gt;Indexes can get bloated over time. In PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;REINDEX&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I do this monthly on my production databases. Keeps things running smooth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 4: Forgetting About Covering Indexes
&lt;/h3&gt;

&lt;p&gt;If your query only needs data that's in the index, the database doesn't even need to touch the main table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_covering&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- This query only touches the index, super fast&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'x'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mistake 5: Over-Optimizing Too Early
&lt;/h3&gt;

&lt;p&gt;I wasted weeks optimizing queries that ran once a day on 1000 rows. Focus on what matters: frequent queries on large tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Strategies (Senior Dev Territory)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strategy 1: Index-Only Scans
&lt;/h3&gt;

&lt;p&gt;Structure your indexes so queries can be answered without touching the table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_posts_covering&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- This query is lightning fast&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Strategy 2: Conditional Indexes with Expressions
&lt;/h3&gt;

&lt;p&gt;You can index the result of a function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_lower_email&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;-- Now this is fast&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prayush@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Strategy 3: Index Hints (Use Sparingly)
&lt;/h3&gt;

&lt;p&gt;Sometimes the query planner gets it wrong. In MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx_email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'x'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But honestly, if you need hints, you probably need better indexes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strategy 4: Monitoring Index Usage
&lt;/h3&gt;

&lt;p&gt;Find unused indexes and kill them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- PostgreSQL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;schemaname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tablename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indexname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx_scan&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_stat_user_indexes&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;idx_scan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I do this every month. Found 15 unused indexes once. Dropped them all, freed up 2GB of space.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Example: My Blog Optimization
&lt;/h2&gt;

&lt;p&gt;Let me show you something from an actual project. I have a blog posts table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initial problem: Homepage query was taking 800ms to load recent posts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'published'&lt;/span&gt; 
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt; 
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;My indexing solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Partial index for published posts only&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_published_posts&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- For author pages&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_author_posts&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- For full-text search&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_post_search&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; 
&lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'english'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homepage: 800ms → 12ms&lt;/li&gt;
&lt;li&gt;Author pages: 450ms → 8ms&lt;/li&gt;
&lt;li&gt;Search: Actually works now (was timing out before)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three strategic indexes. Not twelve random ones. That's the key.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Practical Checklist
&lt;/h2&gt;

&lt;p&gt;Here's what I do for every new table:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Primary key gets an index automatically&lt;/strong&gt; (don't create one manually)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foreign keys ALWAYS get indexed&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;   &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_posts_user_id&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Columns in WHERE clauses get indexed&lt;/strong&gt; (if the query runs often)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Columns in ORDER BY get indexed&lt;/strong&gt; (especially with LIMIT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run EXPLAIN ANALYZE on slow queries&lt;/strong&gt; before creating indexes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor index usage monthly&lt;/strong&gt; and drop the dead ones&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tools I Actually Use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  pgAdmin
&lt;/h3&gt;

&lt;p&gt;For PostgreSQL, pgAdmin's query analyzer is solid. Shows you exactly what's happening.&lt;/p&gt;

&lt;h3&gt;
  
  
  MySQL Workbench
&lt;/h3&gt;

&lt;p&gt;Same thing for MySQL. The visual EXPLAIN is chef's kiss.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Monitoring
&lt;/h3&gt;

&lt;p&gt;I run a self-hosted Grafana dashboard that tracks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query execution times&lt;/li&gt;
&lt;li&gt;Index usage stats&lt;/li&gt;
&lt;li&gt;Table scan counts&lt;/li&gt;
&lt;li&gt;Cache hit ratios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want a tutorial on setting this up? Let me know because monitoring is half the battle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Indexing isn't rocket science, but it's not something you can just wing either. Here's the real strategy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start without indexes (except primary keys and foreign keys)&lt;/li&gt;
&lt;li&gt;Build your app, collect real usage data&lt;/li&gt;
&lt;li&gt;Find the slow queries (EXPLAIN ANALYZE is your friend)&lt;/li&gt;
&lt;li&gt;Add indexes strategically&lt;/li&gt;
&lt;li&gt;Monitor and adjust&lt;/li&gt;
&lt;li&gt;Don't over-optimize early&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And remember: the best index is the one that solves a real performance problem. Not the one that looks cool in your schema.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;I'm &lt;strong&gt;Prayush Adhikari&lt;/strong&gt;, grinding through computer engineering and breaking down complex topics into actually useful content. If database performance gets you excited (or frustrated), you're in the right place.&lt;/p&gt;

&lt;p&gt;Got questions? Want me to cover something specific about databases? Drop a comment. I read every single one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://linkedin.com/in/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter:&lt;/strong&gt; &lt;a href="https://x.com/codersburnout" rel="noopener noreferrer"&gt;codersburnout&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next up, I'm thinking about diving into database sharding or maybe query optimization techniques. What would you rather read about? Let me know.&lt;/p&gt;

&lt;p&gt;Now go index something. But not everything.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>beginners</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Setting Up Your Command Line Assistant with Google Services (The Complete Guide)</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Tue, 04 Nov 2025 07:27:06 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/setting-up-your-command-line-assistant-with-google-services-the-complete-guide-3000</link>
      <guid>https://dev.to/adhikareeprayush/setting-up-your-command-line-assistant-with-google-services-the-complete-guide-3000</guid>
      <description>&lt;p&gt;Hey there! Welcome back. It's been a minute since my last blog on &lt;a href="https://dev.to/adhikareeprayush/7-productivity-hacks-that-changed-my-life-and-will-change-yours-too-19ne"&gt;7 Productivity Hacks That Changed My Life&lt;/a&gt;. Remember hack number 3? The wild command line assistant that manages your entire Google workspace from the terminal?&lt;/p&gt;

&lt;p&gt;Yeah, that one blew up in the comments. Everyone wanted the full breakdown. So here it is, the complete no-BS guide to setting up your own command line assistant with access to Gmail, Google Drive, Calendar, and basically your entire Google ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Setup is Absolutely Insane
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let me paint you a picture of what your life looks like once this is running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send emails&lt;/strong&gt; without ever opening a browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule meetings&lt;/strong&gt; with a single command&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload files to Drive&lt;/strong&gt; from your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search your Gmail&lt;/strong&gt; like you're querying a database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage calendar events&lt;/strong&gt; faster than you can say "productivity"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the best part? It's all happening in your terminal. No clicking. No switching windows. Just pure, efficient command-line magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Need (The Boring But Necessary Stuff)
&lt;/h2&gt;

&lt;p&gt;Look, I'm not gonna sugarcoat it. You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A computer (obviously)&lt;/li&gt;
&lt;li&gt;Stable internet connection (wild requirement in 2024, I know)&lt;/li&gt;
&lt;li&gt;Basic familiarity with terminal/command line&lt;/li&gt;
&lt;li&gt;A Google account&lt;/li&gt;
&lt;li&gt;About 30-45 minutes to set this up properly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One-time setup, lifetime benefits. Let's go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install Gemini CLI (And Why Version Matters)
&lt;/h2&gt;

&lt;p&gt;Here's where most people mess up. You can't just install the latest version and call it a day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Gemini CLI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simple. It integrates seamlessly with Google Apps Script, giving us a robust MCP (Model Context Protocol) server for our command line agent. The integration is chef's kiss level smooth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Version Trap:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I spent hours debugging before I figured this out. You MUST use version &lt;strong&gt;0.1.12&lt;/strong&gt;. The latest versions? Broken. Buggy. Frustrating.&lt;/p&gt;

&lt;p&gt;Save yourself the headache and install the specific version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @google/generative-ai-cli@0.1.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it installed correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;0.1.12&lt;/code&gt;. If not, uninstall and try again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Set Up Google Cloud Console (The Foundation)
&lt;/h2&gt;

&lt;p&gt;This is crucial. Don't skip this step or you'll run into permission issues later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Your Project:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Head over to &lt;a href="https://console.cloud.google.com" rel="noopener noreferrer"&gt;Google Cloud Console&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"New Project"&lt;/strong&gt; in the top dropdown&lt;/li&gt;
&lt;li&gt;Name it something memorable (I called mine "CLI-Assistant")&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Enable the APIs:
&lt;/h3&gt;

&lt;p&gt;You need to enable these APIs for your project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;"APIs &amp;amp; Services"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Library"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search and enable each of these:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gmail API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Drive API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Calendar API&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Docs API&lt;/strong&gt; (optional but recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets API&lt;/strong&gt; (optional but recommended)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Generate Your Gemini API Key:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the Cloud Console, go to &lt;strong&gt;"APIs &amp;amp; Services"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Credentials"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create Credentials"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"API Key"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy this key somewhere safe (you'll need it multiple times)&lt;/li&gt;
&lt;li&gt;(Optional but recommended) Click &lt;strong&gt;"Restrict Key"&lt;/strong&gt; and limit it to only the APIs you enabled&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pro tip: Keep this key private. Like, seriously private.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create Your Google Apps Script
&lt;/h2&gt;

&lt;p&gt;Time to build the brain of the operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Up the Project:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://script.google.com" rel="noopener noreferrer"&gt;script.google.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"New Project"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it something like "MCP Server for CLI"&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Write the Code.gs File:
&lt;/h3&gt;

&lt;p&gt;Delete the default code and paste this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_GEMINI_API_KEY_HERE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ToolsForMCPServer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Enable the tools you want to use&lt;/span&gt;
  &lt;span class="c1"&gt;// Play around with these flags&lt;/span&gt;
  &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enableBaseTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enableClassroomTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enablePeopleTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enableAnalyticsTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enableMapsTools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;eventObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MCPApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mcpApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;accessKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sample&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setServices&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LockService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getScriptLock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Replace&lt;/strong&gt; &lt;code&gt;YOUR_GEMINI_API_KEY_HERE&lt;/code&gt; with the API key you generated earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About those flags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;enableBaseTools&lt;/code&gt;: This is the core. Gmail, Drive, Calendar. Keep this &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The others are specialized. Enable them if you need Classroom, Analytics, or Maps integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Create the appsscript.json File:
&lt;/h3&gt;

&lt;p&gt;This is where permissions live. It's critical.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your Apps Script project, click &lt;strong&gt;"Project Settings"&lt;/strong&gt; (gear icon)&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;"Show 'appsscript.json' manifest file in editor"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Go back to the editor, you'll see &lt;code&gt;appsscript.json&lt;/code&gt; appear&lt;/li&gt;
&lt;li&gt;Replace its contents with this:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeZone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_TIMEZONE_HERE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;e.g.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;America/Los_Angeles&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exceptionLogging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"STACKDRIVER"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"runtimeVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"V8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabledAdvancedServices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userSymbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Drive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"serviceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"drive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v3"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userSymbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gmail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"serviceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gmail"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userSymbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Calendar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"serviceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"calendar"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"libraries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userSymbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MCPApp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"libraryId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1TlX_L9COAriBlAYvrMLiRFQ5WVf1n0jChB6zHamq2TNwuSbVlI5sBUzh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"18"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userSymbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ToolsForMCPServer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"libraryId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1lnE7UL1jQgPDbTB9yjhiwZM0SaS9MObhzvWUWb_t8FisO6A3bLepvM2j"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"39"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"webapp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"executeAs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USER_DEPLOYING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"access"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ANYONE_ANONYMOUS"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"oauthScopes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/gmail.modify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/gmail.send"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/drive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/drive.file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/calendar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/calendar.events"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/spreadsheets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/documents"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/presentations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/forms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.googleapis.com/auth/script.external_request"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;timeZone&lt;/code&gt; to your timezone&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;oauthScopes&lt;/code&gt; are the permissions. This setup requests access to Gmail, Drive, Calendar, Docs, Sheets, etc.&lt;/li&gt;
&lt;li&gt;The libraries (&lt;code&gt;MCPApp&lt;/code&gt; and &lt;code&gt;ToolsForMCPServer&lt;/code&gt;) are essential. Don't change these IDs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Save everything (Ctrl+S or Cmd+S).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Deploy Your Script
&lt;/h2&gt;

&lt;p&gt;This is where your code becomes accessible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Apps Script, click &lt;strong&gt;"Deploy"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"New deployment"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click the gear icon next to "Select type"&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;"Web app"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fill in the details:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: "MCP Server v1" (or whatever you want)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute as&lt;/strong&gt;: "Me"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who has access&lt;/strong&gt;: "Anyone"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Deploy"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authorize the app&lt;/strong&gt; (Google will ask you to review permissions)

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;"Review Permissions"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose your Google account&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Advanced"&lt;/strong&gt; (if it says the app is unverified)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Go to &lt;a href="https://dev.tounsafe"&gt;your project name&lt;/a&gt;"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Allow"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copy the &lt;strong&gt;Web App URL&lt;/strong&gt; that appears. It looks like: &lt;code&gt;https://script.google.com/macros/s/SOME_LONG_ID/exec&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep this URL handy. You're almost there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Configure Gemini CLI to Use Your MCP Server
&lt;/h2&gt;

&lt;p&gt;Now we connect everything together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialize Gemini CLI:
&lt;/h3&gt;

&lt;p&gt;Open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the prompts to set up your Gemini API key if you haven't already.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add the MCP Server:
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Gemini CLI starts, type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens the MCP configuration menu. Follow the interactive prompts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose &lt;strong&gt;"Add new MCP server"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter a name: &lt;code&gt;google-services&lt;/code&gt; (or whatever you prefer)&lt;/li&gt;
&lt;li&gt;Paste your &lt;strong&gt;Web App URL&lt;/strong&gt; from Step 4&lt;/li&gt;
&lt;li&gt;Confirm the configuration&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Test the Connection:
&lt;/h3&gt;

&lt;p&gt;Try a simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check my latest emails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What's on my calendar today?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it works, you'll see Gemini accessing your Google services and returning results. If not, double-check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your API key is correct in Code.gs&lt;/li&gt;
&lt;li&gt;The Web App URL is correct&lt;/li&gt;
&lt;li&gt;You authorized the script properly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 6: Start Living in the Future
&lt;/h2&gt;

&lt;p&gt;You're done. Seriously. Now you can:&lt;/p&gt;

&lt;h3&gt;
  
  
  Send Emails:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Send an email to john@example.com with subject "Meeting Tomorrow" and body "Hey John, are we still on for 3pm?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Schedule Meetings:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a calendar event for tomorrow at 2pm titled "Team Standup"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Search Gmail:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find all emails from boss@company.com from last week
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Upload to Drive:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upload document.pdf to my Google Drive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  And So Much More
&lt;/h3&gt;

&lt;p&gt;The possibilities are endless. The more you use it, the more you'll discover what's possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pro Tips and Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"Permission denied" errors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go back to your Apps Script and re-deploy with fresh permissions&lt;/li&gt;
&lt;li&gt;Make sure all APIs are enabled in Google Cloud Console&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Version mismatch" errors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm you're using gemini-cli version 0.1.12&lt;/li&gt;
&lt;li&gt;Uninstall and reinstall if needed: &lt;code&gt;npm uninstall -g @google/generative-ai-cli &amp;amp;&amp;amp; npm install -g @google/generative-ai-cli@0.1.12&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MCP server not responding:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check your Web App URL is correct&lt;/li&gt;
&lt;li&gt;Make sure the deployment is set to "Anyone" access&lt;/li&gt;
&lt;li&gt;Verify your API key is valid&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Make It Better:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Customize the flags&lt;/strong&gt; in Code.gs based on what you actually use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add more oauth scopes&lt;/strong&gt; if you need access to other Google services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create aliases&lt;/strong&gt; in your shell for common commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experiment&lt;/strong&gt; with different prompts to see what works best&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Real Impact
&lt;/h2&gt;

&lt;p&gt;Here's what changed for me after setting this up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I send emails 5x faster&lt;/li&gt;
&lt;li&gt;Scheduling meetings takes seconds instead of minutes&lt;/li&gt;
&lt;li&gt;I never lose track of files because I can search Drive from anywhere&lt;/li&gt;
&lt;li&gt;My workflow is completely keyboard-driven (no more mouse clicking through UIs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not just about speed. It's about staying in flow. When you can do everything from the terminal, you're not context-switching. Your brain stays focused. That's the real productivity boost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Want me to dive deeper into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom automation workflows&lt;/strong&gt; with this setup?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced MCP server configurations&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrating other services&lt;/strong&gt; beyond Google?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment and let me know what you want to see next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;I'm Prayush Adhikari, computer engineering student and productivity nerd. I'm documenting my journey of building systems that actually work.&lt;/p&gt;

&lt;p&gt;If this guide helped you (or if you got stuck somewhere), let's connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a href="https://linkedin.com/in/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/codersburnout" rel="noopener noreferrer"&gt;codersburnout&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which part of the setup you found most useful&lt;/li&gt;
&lt;li&gt;What you're automating first&lt;/li&gt;
&lt;li&gt;What guide you want next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! Now go build something that makes your life easier.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. If you're stuck on any step, drop a comment. I read and respond to everything.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>7 Productivity Hacks That Changed My Life (And Will Change Yours Too)</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Wed, 15 Oct 2025 08:19:43 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/7-productivity-hacks-that-changed-my-life-and-will-change-yours-too-19ne</link>
      <guid>https://dev.to/adhikareeprayush/7-productivity-hacks-that-changed-my-life-and-will-change-yours-too-19ne</guid>
      <description>&lt;p&gt;Hey there! I am glad you ended up here. Look, I've tried every productivity hack under the sun, and most of them? Complete garbage. But the ones I'm about to share? These actually work. And I'm using them right now as I write this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Talk About Productivity (The Real Deal)
&lt;/h2&gt;

&lt;p&gt;I like to be productive and who doesn't? But wtf is productivity in the first place? &lt;/p&gt;

&lt;p&gt;Here's the thing most people get wrong: productivity isn't about grinding 16 hours a day or having 47 tabs open while pretending to multitask. It's about &lt;strong&gt;doing things more efficiently&lt;/strong&gt; or better yet, &lt;strong&gt;doing repetitive things more efficiently&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And no, efficiency isn't just speed. It's about finding the best approach to get the best possible result. Sometimes that means slowing down to automate something that'll save you hours later.&lt;/p&gt;

&lt;p&gt;Since we have gone through some of the basics, lets dive into the actual hacks that have transformed how I work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hacks That Actually Matter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Ditch Chrome, Seriously
&lt;/h3&gt;

&lt;p&gt;One of the unavoidable things in our life is a web browser. We're constantly living in our browsers when we're online. I have tried almost all the web browsers out there and have finally settled on one that doesn't make me want to throw my laptop out the window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter Vivaldi.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yeah yeah, it eats 2-3gb of RAM like it's nothing, but hear me out. If your computer has 16gb+ RAM or you're already using Chrome (which is basically a RAM black hole), you need to try this.&lt;/p&gt;

&lt;p&gt;Why Vivaldi slaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's chromium based so all your favorite extensions work&lt;/li&gt;
&lt;li&gt;Mouse gestures that make you feel like a wizard&lt;/li&gt;
&lt;li&gt;Keyboard shortcuts for literally everything&lt;/li&gt;
&lt;li&gt;Multiple workspaces to keep your 600 tabs organized&lt;/li&gt;
&lt;li&gt;Themes that don't look like they're from 2010&lt;/li&gt;
&lt;li&gt;Zero bugs in my experience (and I push software to its limits)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The customization is insane. You can make it look and work exactly how your brain operates. And that's the key to productivity, working with tools that match your workflow, not against it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Automate Your Social Media Like a Boss
&lt;/h3&gt;

&lt;p&gt;Social medias like Discord and Telegram are goldmines for automation. And no, you don't need to be a coding wizard to make this happen.&lt;/p&gt;

&lt;p&gt;I've been running self-hosted n8n on my VPS and it's changed the game. Here's what I've built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stream Suggester&lt;/strong&gt; - Because decision fatigue is real&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini in Telegram&lt;/strong&gt; - My AI buddy on the go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Techy&lt;/strong&gt; - Sends me tech news from multiple RSS feeds automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? You set it up once and forget about it. While everyone else is manually checking feeds and posting updates, you're three steps ahead.&lt;/p&gt;

&lt;p&gt;Want me to drop a full tutorial on setting up n8n locally or on a VPS? Drop a comment and let me know because this deserves its own deep dive.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Command Line Assistant (This One's Wild)
&lt;/h3&gt;

&lt;p&gt;Alright, here the things go pure wild. I have a command line assistant that basically runs my digital life. I'm talking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating Google meetings with a single command&lt;/li&gt;
&lt;li&gt;Adding calendar events instantly&lt;/li&gt;
&lt;li&gt;Scanning my Gmail for important stuff&lt;/li&gt;
&lt;li&gt;Sending emails without opening a browser&lt;/li&gt;
&lt;li&gt;Managing all Google services from the terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup is chef's kiss level productivity. Here's the quick rundown:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Setup (Simplified):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install gemini-cli (the MCP server integration is smooth)&lt;/li&gt;
&lt;li&gt;Create a Google Apps Script (hit me up if you want my exact script)&lt;/li&gt;
&lt;li&gt;Configure Google Cloud Console permissions&lt;/li&gt;
&lt;li&gt;Grab your Gemini API key&lt;/li&gt;
&lt;li&gt;Authorize and boom, you're living in the future&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This needs its own blog because the full process is meaty, but trust me, once you have this running, you'll feel like Tony Stark.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Your IDE Matters More Than You Think
&lt;/h3&gt;

&lt;p&gt;Hot take: Your code editor can make or break your productivity.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;Neovim&lt;/strong&gt; and yes, I know what you're thinking. "Oh great, another Neovim evangelist." But hear me out.&lt;/p&gt;

&lt;p&gt;I felt the exact same way when people recommended it to me. Thought they were just trying to be elitist. But after customizing it with the right plugins, I'm never going back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real talk though:&lt;/strong&gt; Don't just jump into Neovim cold turkey. Use &lt;strong&gt;VS Code AND Neovim&lt;/strong&gt; side by side at first. Slowly transition when you're comfortable. The learning curve is real, but the productivity gains are worth it.&lt;/p&gt;

&lt;p&gt;Want a Neovim setup tutorial? Let me know and I'll break down my entire config.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Build Your Second Brain
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Obsidian&lt;/strong&gt; has changed how I think.&lt;/p&gt;

&lt;p&gt;No, seriously. Having all your knowledge in one searchable, linked system is like having superpowers. And the best part? It's completely free if you set up sync yourself (I wrote a whole blog about this).&lt;/p&gt;

&lt;p&gt;Why Obsidian wins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Massive community plugins&lt;/li&gt;
&lt;li&gt;Works on all devices&lt;/li&gt;
&lt;li&gt;Free sync if you're smart about it&lt;/li&gt;
&lt;li&gt;Everything is markdown (lightweight and future-proof)&lt;/li&gt;
&lt;li&gt;Themes that don't hurt your eyes&lt;/li&gt;
&lt;li&gt;Integration with everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your brain isn't meant to remember everything. It's meant to make connections. Let Obsidian handle the storage, you handle the thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Your Terminal Shouldn't Suck
&lt;/h3&gt;

&lt;p&gt;One of the biggest headaches was my terminal. I wanted it to look cool, suggest past commands, and generally not feel like I time-traveled to 1995.&lt;/p&gt;

&lt;p&gt;Solution? &lt;strong&gt;Zsh with oh-my-zsh.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The productivity boost is subtle but massive. Auto-suggestions, better history, plugins for days, and honestly, when your terminal looks good, you want to use it more. And the more comfortable you are in the terminal, the more powerful you become.&lt;/p&gt;

&lt;p&gt;It has surely helped me become more productive without even realizing how much I've improved at command line.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Make The Switch to Linux (Yes, Really)
&lt;/h3&gt;

&lt;p&gt;I would highly recommend all of you to switch to Linux on your personal computers. And no, I'm not one of those "I use Arch btw" people (okay maybe a little).&lt;/p&gt;

&lt;p&gt;Here's why Windows is holding you back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less secure by design&lt;/li&gt;
&lt;li&gt;Bloated with stuff you'll never use&lt;/li&gt;
&lt;li&gt;Ads in the START MENU (seriously Microsoft?)&lt;/li&gt;
&lt;li&gt;Limited customization&lt;/li&gt;
&lt;li&gt;Constant forced updates at the worst times&lt;/li&gt;
&lt;li&gt;You don't actually own your OS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Linux gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete control&lt;/li&gt;
&lt;li&gt;No bloat&lt;/li&gt;
&lt;li&gt;Better security&lt;/li&gt;
&lt;li&gt;Customization freedom&lt;/li&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Actually free (as in freedom)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need help choosing a distro? Want a full guide on making the switch? Drop a comment. I can write a whole series on this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Secret
&lt;/h2&gt;

&lt;p&gt;Here's what nobody tells you about productivity: it's not about the tools. It's about designing systems that work FOR you, not against you.&lt;/p&gt;

&lt;p&gt;Every hack I've shared comes down to one thing: removing friction. The less mental energy you spend on repetitive tasks, the more you have for what actually matters.&lt;/p&gt;

&lt;p&gt;So start with one hack. Just one. Get it working. Then move to the next. Don't try to overhaul your entire workflow overnight because that's how you end up productive for exactly two days before burning out.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;I'm &lt;strong&gt;Prayush Adhikari&lt;/strong&gt;, currently grinding through computer engineering and building my online presence one blog at a time. I'm bringing more content like tutorials, deep dives, and honest takes on tech.&lt;/p&gt;

&lt;p&gt;If this helped you (or if you think I'm completely wrong about something), let's connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop a comment below with which hack you're trying first&lt;/li&gt;
&lt;li&gt;Follow me for more content that actually helps&lt;/li&gt;
&lt;li&gt;Share this if you know someone stuck in productivity hell&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linkedin: &lt;a href="https://linkedin.com/in/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="https://x.com/codersburnout" rel="noopener noreferrer"&gt;codersburnout&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github: &lt;a href="https://github.com/adhikareeprayush" rel="noopener noreferrer"&gt;adhikareeprayush&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What productivity hack should I cover next? Let me know in the comments.&lt;/p&gt;

&lt;p&gt;Thanks for reading! Now go automate something.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>linux</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stop Paying for Obsidian Sync: Here's How I Actually Did It</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Mon, 06 Oct 2025 19:26:04 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/stop-paying-for-obsidian-sync-heres-how-i-actually-did-it-3i4h</link>
      <guid>https://dev.to/adhikareeprayush/stop-paying-for-obsidian-sync-heres-how-i-actually-did-it-3i4h</guid>
      <description>&lt;p&gt;So you've fallen into the Obsidian rabbit hole. Good. Now you're realizing that having your notes on just one device is annoying as hell, and Obsidian wants $10/month to fix that problem. &lt;/p&gt;

&lt;p&gt;I get it—the devs deserve support, they built something genuinely useful. But I'm also not about to pay a subscription for syncing &lt;em&gt;text files&lt;/em&gt;. Yes, I said it. That's all your vault is. A bunch of &lt;code&gt;.md&lt;/code&gt; files sitting in a folder. &lt;/p&gt;

&lt;p&gt;So I rolled my own sync setup with Syncthing-Fork, and it's been running flawlessly across my laptop, phone, and a VPS for months. Zero cost, zero drama. Let me show you how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Beauty of Obsidian: It's Just Files
&lt;/h2&gt;

&lt;p&gt;Here's why this works at all: Obsidian doesn't trap your data in some proprietary hellscape. Your vault is literally just a folder on your filesystem. Open it. Look at it. Those are markdown files. You could edit them in Notepad if you wanted to punish yourself.&lt;/p&gt;

&lt;p&gt;This isn't revolutionary—it's how software &lt;em&gt;should&lt;/em&gt; work. But in 2025, when every app wants to be a SaaS product with your data held hostage on their servers, Obsidian's approach feels almost rebellious.&lt;/p&gt;

&lt;p&gt;No database. No API calls to authenticate your right to access your own thoughts. Just files and folders, like it's 1995 and we still believed in owning our data.&lt;/p&gt;

&lt;p&gt;Which means if you can sync a folder, you can sync your entire Obsidian vault. And you absolutely can sync a folder without giving someone money every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Syncthing-Fork: The Unsexy Solution That Actually Works
&lt;/h2&gt;

&lt;p&gt;Syncthing is that rare piece of software that does one thing, does it well, and doesn't try to upsell you on AI features or premium tiers. It's open source, peer-to-peer, and once you set it up, you genuinely forget it exists.&lt;/p&gt;

&lt;p&gt;Syncthing-Fork is the Android variant that actually gets maintained.&lt;/p&gt;

&lt;p&gt;What sold me: I edit a note on my phone at 2 AM because my brain won't shut up. By the time I walk to my desk in the morning, that note is already on my laptop. No sync button. No "waiting for upload." It just &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The whole thing runs device-to-device. Encrypted. No cloud middleman harvesting your data to train their next AI model.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Setup: Three Devices Playing Nice
&lt;/h2&gt;

&lt;p&gt;I'm running this across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Laptop&lt;/strong&gt; (Arch BTW)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android phone&lt;/strong&gt; (Syncthing-Fork from Nickola Hristov)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPS&lt;/strong&gt; (Docker container, always online)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The VPS is technically optional. But here's the thing: if my laptop's off and I change something on my phone, the VPS catches it immediately. Then when my laptop wakes up, it syncs from the VPS. It's basically a relay that ensures changes never get stuck in limbo. I am also planning to use static site generator out of &lt;code&gt;.md&lt;/code&gt; files for future so it will be helpful ig.&lt;/p&gt;

&lt;p&gt;Plus it's an automatic off-site backup. My laptop could spontaneously combust and my vault's still sitting on that VPS.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Actually Set This Up
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Making Syncthing Run Without Thinking About It
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Laptop&lt;/strong&gt;: Installed Syncthing, made it a systemd service so it starts on boot. I never want to manually start this thing. If I have to remember to run it, I'll forget, and then I'll have sync conflicts. Automate or die.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VPS&lt;/strong&gt;: Spun up a Docker container. Wrote a basic &lt;code&gt;docker-compose.yml&lt;/code&gt;, ran it, forgot about it. Docker handles restarts, keeps it isolated, makes updates trivial. The VPS isn't doing anything else demanding—it's just sitting there being reliable, which is what servers are actually for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone&lt;/strong&gt;: Installed Syncthing-Fork, gave it the permissions it was crying about, set it to auto-start. Battery impact is negligible. We're syncing text, not mining crypto.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Connection Dance
&lt;/h3&gt;

&lt;p&gt;Every Syncthing instance has a device ID. I added all three devices to each other. Think of it like exchanging SSH keys, except it's actually user-friendly.&lt;/p&gt;

&lt;p&gt;Then I pointed Syncthing at my Obsidian vault folder and told it to share that folder with all my devices. That's it. That's the setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watching It Actually Work
&lt;/h3&gt;

&lt;p&gt;Change a file on any device. Syncthing detects it within seconds. The change propagates to the other devices. Obsidian notices the file changed and updates its view. &lt;/p&gt;

&lt;p&gt;It's not magic—it's just file watching and network sockets. But it &lt;em&gt;feels&lt;/em&gt; magic when you're used to cloud sync services that randomly decide they need five minutes to "think about it."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Syncthing Doesn't Suck
&lt;/h2&gt;

&lt;p&gt;Block-level syncing means it only transfers what changed. Edit one paragraph? It sends that delta, not the entire file. This matters when you're on mobile data or have a 50MB vault full of images.&lt;/p&gt;

&lt;p&gt;Conflict handling is reasonable. If you somehow edit the same file on two disconnected devices (how?), it creates a conflict copy instead of randomly picking a winner. You manually merge. Annoying, but better than silent data loss.&lt;/p&gt;

&lt;p&gt;Everything's encrypted in transit. Your existential crisis notes aren't flying across the internet in plaintext for your ISP to judge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The VPS Piece
&lt;/h2&gt;

&lt;p&gt;Two devices can sync directly without a VPS. Phone talks to laptop when both are online. But the VPS makes this bulletproof.&lt;/p&gt;

&lt;p&gt;I'm paranoid about losing data. Having an always-online third node means changes &lt;em&gt;always&lt;/em&gt; have somewhere to go. Plus, it's offsite. My apartment could burn down and my notes would survive.&lt;/p&gt;

&lt;p&gt;Running in Docker is just good practice. Isolated, reproducible, updateable. One &lt;code&gt;docker-compose up -d&lt;/code&gt; and it's running forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Feels Like
&lt;/h2&gt;

&lt;p&gt;I've been running this for months. I don't think about it. That's the highest compliment I can give any infrastructure.&lt;/p&gt;

&lt;p&gt;I dump thoughts into Obsidian on my phone while walking. Those thoughts are on my laptop by the time I get home. I refactor my notes at my desk, and they're on my phone instantly. The VPS quietly keeps everything synchronized without me ever SSHing in to check on it.&lt;/p&gt;

&lt;p&gt;Zero conflicts. Zero "oops, I edited the old version" moments. Zero subscription fees.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You're Technical Enough to Care
&lt;/h2&gt;

&lt;p&gt;You're probably already sold or already running something similar. If you're on the fence: one Saturday afternoon to set this up, then you never think about it again.&lt;/p&gt;

&lt;p&gt;No subscription. No trusting a third-party with your data. No wondering if the sync service will still exist in five years or if they'll get acquired and enshittified.&lt;/p&gt;

&lt;p&gt;Just files, syncing between your devices, like we've been doing since rsync was invented.&lt;/p&gt;

&lt;p&gt;If you're still paying for Obsidian Sync after reading this... I mean, that's your choice. But at least know you have options.&lt;/p&gt;

&lt;p&gt;Lets Connect:&lt;br&gt;
&lt;a href="https://x.com/APrayush" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/adhikareeprayush" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.github.com/adhikareeprayush" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>obsidian</category>
      <category>automation</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Top 10 Visual Studio Code Extensions for Enhanced Productivity</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Sat, 28 Sep 2024 13:25:00 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/top-10-visual-studio-code-extensions-for-enhanced-productivity-4emb</link>
      <guid>https://dev.to/adhikareeprayush/top-10-visual-studio-code-extensions-for-enhanced-productivity-4emb</guid>
      <description>&lt;h2&gt;
  
  
  Top 10 VS Code Extensions You Absolutely Need (or Else!)
&lt;/h2&gt;

&lt;p&gt;So, you’ve hopped on the Visual Studio Code train, huh? Welcome aboard! It’s sleek, it’s lightweight, and, oh boy, those extensions! They’re like sprinkles on a cupcake—totally necessary. Whether you’re a coding wizard or still figuring out the difference between a variable and a function, here’s a curated list of the top 10 VS Code extensions that you should definitely check out (because why not?).&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;strong&gt;Prettier - Code Formatter&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Ever looked at your code and thought, “Yikes, what a mess”? Prettier is here to save the day! This opinionated code formatter works its magic on multiple languages, enforcing a consistent style. It's like having a professional organizer for your codebase. Trust me, your team will thank you (and maybe even throw you a party).&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" rel="noopener noreferrer"&gt;Get Started with Prettier!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;strong&gt;ESLint&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For all you JavaScript and TypeScript aficionados, ESLint is like that annoying friend who always points out your mistakes—except this one helps you write cleaner code. It spots and fixes issues in real-time, so you can avoid those embarrassing “uh-oh” moments during code reviews.&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" rel="noopener noreferrer"&gt;Learn More About ESLint&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;strong&gt;Live Server&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Web developers, rejoice! The Live Server extension is your best friend. It sets up a local server and gives you live reload capabilities. So while you're frantically changing your HTML, CSS, and JavaScript, you’ll see those changes in real-time. No more refresh, refresh, refresh. Just sit back and watch the magic unfold!&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;Check Out Live Server&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;strong&gt;GitHub Copilot&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine having an AI-powered coding buddy who gets your coding style. GitHub Copilot offers suggestions for entire lines of code or functions, helping you tackle repetitive tasks and even suggesting cool solutions you might not have thought of. It’s like magic for your code!&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot" rel="noopener noreferrer"&gt;Explore GitHub Copilot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;strong&gt;Docker&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For those of you diving into the world of containers (not the ones you keep your leftovers in), the Docker extension is a game changer. Manage and deploy Docker containers right from VS Code like a boss. It’s like having a personal assistant for your containerized applications, minus the coffee runs.&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker" rel="noopener noreferrer"&gt;Get Docker Here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. &lt;strong&gt;Vim&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re a fan of Vim’s powerful keybindings, you’re in luck. The Vim extension brings all those shortcuts to VS Code, so you can navigate and edit like a pro without ever lifting your fingers from the keyboard. It’s like giving your IDE superpowers, and you’ll feel unstoppable!&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=vscodevim.vim" rel="noopener noreferrer"&gt;Try Vim for VS Code&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. &lt;strong&gt;Auto Rename Tag&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For all the HTML/XML folks out there, Auto Rename Tag is a lifesaver. It automatically updates paired tags when you edit one of them, helping you avoid mismatches and keeping your code neat. It’s like having a cleanup crew for your tags.&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag" rel="noopener noreferrer"&gt;Check Out Auto Rename Tag&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. &lt;strong&gt;Error Lens&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s face it: errors are a fact of coding life. But Error Lens makes spotting them way easier by showing error and warning messages directly in your code, right where the problem is. No more scrolling around looking for the issues—just fix it and move on!&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens" rel="noopener noreferrer"&gt;Get Error Lens&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. &lt;strong&gt;CodeSnap&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Love sharing your code online? CodeSnap makes it simple to take beautiful screenshots of your code, perfect for blog posts, social media, or documentation. Say goodbye to clunky screenshots and hello to polished, professional snaps.&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap" rel="noopener noreferrer"&gt;Get CodeSnap&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. &lt;strong&gt;Thunder Client&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Testing APIs has never been easier! Thunder Client is a super-lightweight REST API client right inside VS Code, making it a fantastic alternative to bulky tools like Postman. Test APIs without ever leaving your editor.&lt;br&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client" rel="noopener noreferrer"&gt;Discover Thunder Client&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you're looking to elevate your development experience with these extensions and more, feel free to check out my link to &lt;a href="https://code.visualstudio.com/?WT.mc_id=academic&amp;amp;wt.mc_id=studentamb_293386" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;. It’s a fantastic resource that can help you get set up and make your coding life smoother than ever. So, gear up, download VS Code, and let’s make some code magic happen!&lt;/p&gt;




&lt;h2&gt;
  
  
  Join the PrayushDev Community!
&lt;/h2&gt;

&lt;p&gt;Before you go, I'm excited to announce the launch of my weekly newsletter: PrayushDev! 🎉&lt;/p&gt;

&lt;p&gt;Why should you subscribe? Here's what you'll get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bite-sized introductions to hot tech topics&lt;/li&gt;
&lt;li&gt;Insider tips and tricks from the world of development&lt;/li&gt;
&lt;li&gt;Early access to upcoming "React Unmasked" episodes&lt;/li&gt;
&lt;li&gt;A chance to be part of a growing community of passionate devs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't miss out on this opportunity to stay at the cutting edge of tech. Subscribe now and let's grow together!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://prayushdev.beehiiv.com/subscribe" rel="noopener noreferrer"&gt;Subscribe to PrayushDev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>coding</category>
      <category>vscode</category>
      <category>programming</category>
    </item>
    <item>
      <title>Create your API using C++</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Fri, 09 Aug 2024 15:19:41 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/create-your-api-using-c-13ej</link>
      <guid>https://dev.to/adhikareeprayush/create-your-api-using-c-13ej</guid>
      <description>&lt;h1&gt;
  
  
  Creating a C++ API with Drogon Framework
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In today's connected world, APIs are the backbone of modern applications, enabling different software systems to communicate with each other. While many developers rely on frameworks like Node.js, Python, or Java for building APIs, C++ is a powerful yet often overlooked option. This tutorial will walk you through creating your own API using C++ and the Drogon framework—a high-performance, production-ready framework for developing web applications.&lt;br&gt;
View my repo on TheBookDB-API for reference: &lt;a href="https://github.com/adhikareeprayush/TheBookDB-API" rel="noopener noreferrer"&gt;Click Here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Learn:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Setting up a C++ development environment for API creation&lt;/li&gt;
&lt;li&gt;Creating a basic API using the Drogon framework&lt;/li&gt;
&lt;li&gt;Managing routes, endpoints, and handling HTTP methods&lt;/li&gt;
&lt;li&gt;Working with JSON data using JsonCpp&lt;/li&gt;
&lt;li&gt;Best practices for structuring and deploying your API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Overview: TheBookDB
&lt;/h2&gt;

&lt;p&gt;We'll build a simple book database API called &lt;strong&gt;TheBookDB&lt;/strong&gt;. This API will allow users to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieve a List of Books&lt;/li&gt;
&lt;li&gt;Filter Books&lt;/li&gt;
&lt;li&gt;Add New Books&lt;/li&gt;
&lt;li&gt;Update Existing Books&lt;/li&gt;
&lt;li&gt;Delete Books&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key API Endpoints:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GET /books: Retrieve all books in the database&lt;/li&gt;
&lt;li&gt;GET /books/filter: Filter books based on criteria like publication date and author&lt;/li&gt;
&lt;li&gt;POST /books: Add a new book to the database&lt;/li&gt;
&lt;li&gt;PATCH /books/{bookID}: Update an existing book's details&lt;/li&gt;
&lt;li&gt;DELETE /books/{bookID}: Delete a book from the database&lt;/li&gt;
&lt;li&gt;PUT /books/{bookID}: Update or add a book&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technologies and Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Drogon Framework&lt;/li&gt;
&lt;li&gt;JsonCpp&lt;/li&gt;
&lt;li&gt;Linux (Ubuntu)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create a new Drogon project:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;drogon_ctl create project &amp;lt;project_name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a controller for the Book API:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;drogon_ctl create controller Book&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the project directory and build:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;cd &amp;lt;project_name&amp;gt;&lt;br&gt;
   mkdir build &lt;br&gt;
   cd build&lt;br&gt;
   cmake ..&lt;br&gt;
   make&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the project:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;./&amp;lt;project_name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Prepare your books.csv file and place it in the root directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update CMakeLists.txt to copy the CSV file to the build directory:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;configure_file(${CMAKE_SOURCE_DIR}/books.csv&lt;br&gt;
${CMAKE_BINARY_DIR}/books.csv COPYONLY)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Book.h
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/adhikareeprayush/8fe7012390a4870d8c391c4533a56c50" rel="noopener noreferrer"&gt;Click here to view Book.h&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Book.cpp
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/adhikareeprayush/381e0c6b3180c6837226282fef1665ba" rel="noopener noreferrer"&gt;Click here to view Book.cpp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the API
&lt;/h2&gt;

&lt;p&gt;After completing the implementation, build and run the application. Check the &lt;code&gt;config.json&lt;/code&gt; file to find the port on which your application will run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the PrayushDev Community
&lt;/h2&gt;

&lt;p&gt;Subscribe to the weekly PrayushDev newsletter for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bite-sized introductions to hot tech topics&lt;/li&gt;
&lt;li&gt;Insider tips and tricks from the world of development&lt;/li&gt;
&lt;li&gt;Early access to upcoming "React Unmasked" episodes&lt;/li&gt;
&lt;li&gt;A chance to be part of a growing community of passionate devs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://prayushdev.beehiiv.com/subscribe" rel="noopener noreferrer"&gt;Subscribe to PrayushDev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>drogon</category>
      <category>api</category>
      <category>development</category>
    </item>
    <item>
      <title>The Ultimate Roadmap to a Full-Stack Developer</title>
      <dc:creator>Prayush Adhikari</dc:creator>
      <pubDate>Thu, 22 Feb 2024 11:40:23 +0000</pubDate>
      <link>https://dev.to/adhikareeprayush/the-ultimate-roadmap-to-a-full-stack-developer-5elh</link>
      <guid>https://dev.to/adhikareeprayush/the-ultimate-roadmap-to-a-full-stack-developer-5elh</guid>
      <description>&lt;p&gt;&lt;em&gt;We all wonder about the best way to start learning web development and how to become a successful full-stack developer in our career. Learning the surface is easy but as we dive deep into it most of us feel tired and give up easily. In this article, we will be discussing the various ways to start our web development journey and learn how we can become a great web developer.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Start Learning the Frontend Part First&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Starting with learning the frontend part of web development is a common and logical first step for many aspiring developers. This approach allows learners to focus on the visible aspects of web development—the user interface and user experience—before delving into the complexities of backend development and server-side operations.&lt;/p&gt;

&lt;p&gt;By beginning with frontend technologies such as HTML, CSS, and JavaScript, learners can quickly grasp the fundamentals of web design and interactivity. HTML provides the structure of a web page, and CSS styles, and enhances its appearance, while JavaScript adds dynamic behavior and interactivity to the user interface.&lt;/p&gt;

&lt;p&gt;Starting with frontend development also enables learners to see immediate results, as they can create simple web pages and interactive elements relatively quickly. This can be highly motivating and encouraging, especially for beginners who may feel overwhelmed by the vastness of web development.&lt;/p&gt;

&lt;p&gt;As learners progress in their frontend journey, they can explore advanced concepts and frameworks such as responsive design, CSS preprocessors like Sass or Less, and modern JavaScript libraries and frameworks like React.js, Angular, or Vue.js. These tools empower developers to build more complex and dynamic web applications while adhering to best practices and industry standards.&lt;/p&gt;

&lt;p&gt;However, it's essential to recognize that front-end development is just one piece of the puzzle. To become a well-rounded and successful full-stack developer, learners should eventually expand their skills to include backend development, database management, and other related technologies.&lt;/p&gt;

&lt;p&gt;In conclusion, starting with front-end development is a practical and effective way to begin your journey into web development. By mastering the frontend part first, you can build a solid foundation of skills and knowledge that will serve as a springboard for further learning and growth as you progress towards becoming a successful full-stack developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dive into the Backend
&lt;/h2&gt;

&lt;p&gt;After gaining a solid understanding of frontend development, the next logical step in becoming a full-stack developer is diving into backend development. While frontend development focuses on what users see and interact with, backend development deals with the behind-the-scenes functionality that powers web applications.&lt;/p&gt;

&lt;p&gt;Backend development involves creating server-side logic, managing databases, handling authentication and authorization, and integrating with external services and APIs. It's the backbone of any dynamic web application, enabling it to handle complex business logic, process data, and respond to user requests effectively.&lt;/p&gt;

&lt;p&gt;Here are some key aspects to consider when diving into backend development:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose a Backend Language/Framework&lt;/strong&gt;: Start by selecting a backend programming language and framework to focus on. Popular choices include Node.js (JavaScript), Python (Django or Flask), Ruby on Rails, and Java (Spring Boot). Each language and framework has its strengths and use cases, so choose one that aligns with your goals and interests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learn Server-side Concepts&lt;/strong&gt;: Familiarize yourself with server-side concepts such as routing, middleware, request handling, and response generation. Understand how servers communicate with clients using protocols like HTTP and WebSocket, and learn about RESTful API design principles for building robust and scalable APIs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Management&lt;/strong&gt;: Gain proficiency in working with databases, both SQL and NoSQL. Learn how to design database schemas, perform CRUD (Create, Read, Update, Delete) operations, and optimize database performance. Common databases include MySQL, PostgreSQL, MongoDB, and Firebase Firestore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authentication and Authorization&lt;/strong&gt;: Understand the concepts of authentication (verifying user identities) and authorization (granting access rights). Learn how to implement user authentication mechanisms such as password hashing, JWT (JSON Web Tokens), OAuth, and session management to secure your applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API Integration&lt;/strong&gt;: Explore how to integrate your backend with external services and APIs to extend the functionality of your applications. This may involve consuming third-party APIs for tasks like payment processing, sending emails, or accessing social media platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing and Debugging&lt;/strong&gt;: Learn how to write unit tests and perform integration testing to ensure the reliability and robustness of your backend code. Familiarize yourself with debugging tools and techniques to identify and fix issues efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployment and DevOps&lt;/strong&gt;: Gain experience in deploying and managing backend applications in production environments. Learn about DevOps practices such as continuous integration, continuous deployment (CI/CD), containerization (using Docker), and orchestration (with tools like Kubernetes) to automate the deployment process and ensure scalability and reliability.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By diving into backend development, you'll complement your frontend skills and become proficient in building full-fledged web applications from end to end. Embrace the challenges, stay curious, and continue learning as you embark on your journey to becoming a successful full-stack developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some of the resources are
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MDN Web Docs&lt;/strong&gt; - Mozilla Developer Network offers comprehensive documentation on HTML, CSS, JavaScript, and web standards.&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;W3Schools&lt;/strong&gt; - Provides tutorials, references, and exercises on HTML, CSS, JavaScript, and other web technologies.&lt;br&gt;
&lt;a href="https://www.w3schools.com/" rel="noopener noreferrer"&gt;W3Schools&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;freeCodeCamp&lt;/strong&gt; - Offers free online courses on web development, including HTML, CSS, JavaScript, and backend technologies like Node.js and Express.js.&lt;br&gt;
&lt;a href="https://www.freecodecamp.org/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSS-Tricks&lt;/strong&gt; - A web design community that provides tutorials, articles, and resources on CSS, front-end development, and design trends.&lt;br&gt;
&lt;a href="https://css-tricks.com/" rel="noopener noreferrer"&gt;CSS-Tricks&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Net Ninja&lt;/strong&gt; - YouTube channel offering tutorials on frontend technologies like HTML, CSS, JavaScript, and frameworks like React and Vue.js.&lt;br&gt;
&lt;a href="https://www.youtube.com/channel/UCW5YeuERMmlnqo4oq8vwUpg" rel="noopener noreferrer"&gt;The Net Ninja&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stack Overflow&lt;/strong&gt; - Q&amp;amp;A platform where developers can ask questions and find answers on a wide range of topics related to frontend and backend development.&lt;br&gt;
&lt;a href="https://stackoverflow.com/" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DevDocs&lt;/strong&gt; - Aggregates documentation from various sources into a single, easy-to-navigate interface, covering frontend and backend technologies.&lt;br&gt;
&lt;a href="https://devdocs.io/" rel="noopener noreferrer"&gt;DevDocs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node.js Official Documentation&lt;/strong&gt; - Offers comprehensive documentation and guides for Node.js, a popular backend JavaScript runtime.&lt;br&gt;
&lt;a href="https://nodejs.org/en/docs/" rel="noopener noreferrer"&gt;Node.js Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Django Documentation&lt;/strong&gt; - Official documentation for Django, a high-level Python web framework for backend development.&lt;br&gt;
&lt;a href="https://docs.djangoproject.com/en/stable/" rel="noopener noreferrer"&gt;Django Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Express.js Documentation&lt;/strong&gt; - Official documentation for Express.js, a minimal and flexible Node.js web application framework for backend development.&lt;br&gt;
&lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express.js Documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Join the PrayushDev Community
&lt;/h2&gt;

&lt;p&gt;Subscribe to the weekly PrayushDev newsletter for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bite-sized introductions to hot tech topics&lt;/li&gt;
&lt;li&gt;Insider tips and tricks from the world of development&lt;/li&gt;
&lt;li&gt;Early access to upcoming "React Unmasked" episodes&lt;/li&gt;
&lt;li&gt;A chance to be part of a growing community of passionate devs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://prayushdev.beehiiv.com/subscribe" rel="noopener noreferrer"&gt;Subscribe to PrayushDev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Support My Journey as a Microsoft Student Ambassador
&lt;/h2&gt;

&lt;p&gt;Help me reach my goal as a Microsoft Student Ambassador:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit my special link: &lt;a href="http://microsoft.com/Microsoft-Fabric/?WT.mc_id=academic&amp;amp;wt.mc_id=studentamb_293386" rel="noopener noreferrer"&gt;Microsoft Student Ambassador&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Explore the page and learn about the initiatives&lt;/li&gt;
&lt;li&gt;Share the link with your friends and colleagues&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My goal is to reach 250 visitors. Your support contributes to tech education and community building.&lt;/p&gt;

&lt;p&gt;Thank you for being part of this journey!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
