| 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.
:::
You also need:
- A MongoDB database accessible via connection string
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 likeprisma init,prisma db push, andprisma generate@prisma/client- The Prisma Client library for querying your databasedotenv- Loads environment variables from your.envfile
:::note
MongoDB doesn't require driver adapters since Prisma ORM connects directly to MongoDB.
:::
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
}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 aschema.prismafile containing your database connection and schema models - Creates a
.envfile in the root directory for environment variables - Generates the Prisma Client in the
generated/prisma/directory - Creates a
prisma.config.tsfile 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.
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-endSince 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
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 }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!
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.
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.