Skip to content

Latest commit

 

History

History
301 lines (221 loc) · 7.56 KB

File metadata and controls

301 lines (221 loc) · 7.56 KB
title sidebar_label metaTitle metaDescription
Quickstart with Prisma ORM and MongoDB
MongoDB
Quickstart: Prisma ORM with MongoDB (10 min)
Create a new TypeScript project from scratch by connecting Prisma ORM to MongoDB and generating a Prisma Client for database access.

import Prerequisites from '../../_components/_prerequisites.mdx' import CreateProject from '../../_components/_create-project.mdx' import ExploreData from '../../_components/_explore-data.mdx' import NextSteps from '../../_components/_next-steps.mdx'

MongoDB is a popular NoSQL document database. In this guide, you will learn how to set up a new TypeScript project from scratch, connect it to MongoDB using Prisma ORM, and generate a Prisma Client for easy, type-safe access to your database.

:::warning[Do not upgrade to Prisma ORM v7 if you are using MongoDB]

Prisma ORM v7 is not yet compatible with MongoDB. Please use Prisma ORM v6 instead. Support for MongoDB is coming in a future release.

:::

Prerequisites

You also need:

  • A MongoDB database accessible via connection string

1. Create a new project

2. Install required dependencies

Install the packages needed for this quickstart:

npm install prisma @types/node --save-dev 
npm install @prisma/client dotenv

Here's what each package does:

  • prisma - The Prisma CLI for running commands like prisma init, prisma db push, and prisma generate
  • @prisma/client - The Prisma Client library for querying your database
  • dotenv - Loads environment variables from your .env file

:::note

MongoDB doesn't require driver adapters since Prisma ORM connects directly to MongoDB.

:::

3. Configure ESM support

Update tsconfig.json for ESM compatibility:

{
  "compilerOptions": {
    "module": "ESNext",
    "moduleResolution": "node",
    "target": "ES2023",
    "strict": true,
    "esModuleInterop": true,
    "ignoreDeprecations": "6.0"
  }
}

Update package.json to enable ESM:

{
  // add-start
  "type": "module",
  // add-end
}

4. Initialize Prisma ORM

You can now invoke the Prisma CLI by prefixing it with npx:

npx prisma

Next, set up your Prisma ORM project by creating your Prisma Schema file with the following command:

npx prisma init --datasource-provider mongodb --output ../generated/prisma

This command does a few things:

  • Creates a prisma/ directory with a schema.prisma file containing your database connection and schema models
  • Creates a .env file in the root directory for environment variables
  • Generates the Prisma Client in the generated/prisma/ directory
  • Creates a prisma.config.ts file for Prisma configuration

The generated prisma.config.ts file looks like this:

import { defineConfig, env } from 'prisma/config'

export default defineConfig({
  schema: 'prisma/schema.prisma',
  migrations: {
    path: 'prisma/migrations',
  },
  engine: "classic",
  datasource: {
    url: env('DATABASE_URL'),
  },
})

Add dotenv to prisma.config.ts so that Prisma can load environment variables from your .env file:

// add-start
import 'dotenv/config'
// add-end
import { defineConfig, env } from 'prisma/config'

export default defineConfig({
  schema: 'prisma/schema.prisma',
  migrations: {
    path: 'prisma/migrations',
  },
  engine: "classic",
  datasource: {
    url: env('DATABASE_URL'),
  },
})

The generated schema uses the ESM-first prisma-client generator with a custom output path:

generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
}

datasource db {
  provider = "mongodb"
  url = env("DATABASE_URL")
}

Update your .env file with your MongoDB connection string:

DATABASE_URL="mongodb+srv://username:password@cluster.mongodb.net/mydb"

Replace with your actual MongoDB connection string.

5. Define your data model

Open prisma/schema.prisma and add the following models:

generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
}

datasource db {
  provider = "mongodb"
  url = env("DATABASE_URL")
}

//add-start
model User {
  id    String  @id @default(auto()) @map("_id") @db.ObjectId
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id        String  @id @default(auto()) @map("_id") @db.ObjectId
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  String  @db.ObjectId
}
//add-end

6. Push your schema to MongoDB

Since MongoDB doesn't use migrations, push your schema directly:

npx prisma db push

This command creates the collections based on your schema.

Now run the following command to generate the Prisma Client:

npx prisma generate

7. Instantiate Prisma Client

Now that you have all the dependencies installed, you can instantiate Prisma Client:

import "dotenv/config";
import { PrismaClient } from '../generated/prisma/client'

const prisma = new PrismaClient()

export { prisma }

8. Write your first query

Create a script.ts file to test your setup:

import { prisma } from './lib/prisma'

async function main() {
  // Create a new user with a post
  const user = await prisma.user.create({
    data: {
      name: 'Alice',
      email: 'alice@prisma.io',
      posts: {
        create: {
          title: 'Hello World',
          content: 'This is my first post!',
          published: true,
        },
      },
    },
    include: {
      posts: true,
    },
  })
  console.log('Created user:', user)

  // Fetch all users with their posts
  const allUsers = await prisma.user.findMany({
    include: {
      posts: true,
    },
  })
  console.log('All users:', JSON.stringify(allUsers, null, 2))
}

main()
  .then(async () => {
    await prisma.$disconnect()
  })
  .catch(async (e) => {
    console.error(e)
    await prisma.$disconnect()
    process.exit(1)
  })

Run the script:

npx tsx script.ts

You should see the created user and all users printed to the console!

9. Explore your data with Prisma Studio

Next steps

Troubleshooting

Error in connector: SCRAM failure: Authentication failed.

If you see the Error in connector: SCRAM failure: Authentication failed. error message, you can specify the source database for the authentication by adding ?authSource=admin to the end of the connection string.

Raw query failed. Error code 8000 (AtlasError): empty database name not allowed.

If you see the Raw query failed. Code: unknown. Message: Kind: Command failed: Error code 8000 (AtlasError): empty database name not allowed. error message, be sure to append the database name to the database URL. You can find more info in this GitHub issue.

More info