行业资讯 2025年08月6日
0 收藏 0 点赞 178 浏览 3694 个字
摘要 :

文章目录 一、为什么? 二、docker–compose 相关 1)docker-compose 编排 2)初始化集群 2)运行与停止 3)VSCode 中链接 MongoDB 三、在 Prisma 中使用 mongoD……




  • 一、为什么?
  • 二、dockercompose 相关
    • 1)docker-compose 编排
    • 2)初始化集群
    • 2)运行与停止
    • 3)VSCode 中链接 MongoDB
  • 三、在 Prisma 中使用 mongoDB 集群
    • 1) 安装依赖
    • 2) 初始化
    • 3) 生成客户端
    • 4) pnpm 中添加前置脚本
    • 5) 修改 prisma.schema 并定义 User 文件
  • 四、在 NestJS Service 中提供 CRUD/List/Count 服务
  • 六、小结

一、为什么?

为什么要使用 Prisma ORM 操作 MongoDB 副本集?官方解释是因为需要支持事务。下面将介绍如何使用 docker/docker-compose 快速创建一个适合TS/JS开发者的mongoDB 副本集,并使用 Prisma ORM 完成基本的 CURD/List/Count 操作。

请注意,本文的重点是搭建 TS/JS 环境以构建副本集,数据库安全问题需要另外考虑。阅读本文需要具备 docker/docker-compose/PrismaORM/Node.js/NestJS 等相关基础知识。

二、docker-compose 相关

推荐使用 docker-compose 客户端

1)docker-compose 编排

编排使用最简单的: 1 主, 2 从,3 投票的方式。

version: \'3\'

services:
  mongodb-primary:
    image: mongo:latest
    container_name: mongodb-primary
    ports:
      - \'27017:27017\'
    command: mongod --replSet rs0
    networks:
      - my-network

  mongodb-secondary:
    image: mongo:latest
    container_name: mongodb-secondary
    depends_on:
      - mongodb-primary
    command: mongod --replSet rs0
    networks:
      - my-network

  mongodb-arbiter:
    image: mongo:latest
    container_name: mongodb-arbiter
    depends_on:
      - mongodb-primary
    command: mongod --replSet rs0 --oplogSize 128
    networks:
      - my-network

networks:
  my-network:
    driver: bridge

主应用对外暴露 27017 的端口。

2)初始化集群

进入 mongodb-primary 容器中, 输入 mongosh,进入 MongoDB 提供的 shell 工具,执行如下命令

  _id: \'rs0\',
  members: [
    { _id: 0, host: \'mongodb-primary:27017\' },
    { _id: 1, host: \'mongodb-secondary:27017\' },
    { _id: 2, host: \'mongodb-arbiter:27017\' },
  ],
});

如果一切正常,副本集就正常启动了。可以访问 来查看服务是否正常启动

2)运行与停止

docker-compose up -d # 默认docker-compose 文件
docker-compose down # 移除

3)VSCode 中链接 MongoDB

VS Code 中 安装插件

提供了两种链接方式:

字符串链接

mongodb://localhost:27017/test_db?readPreference=primary&ssl=false&directConnection=true
# 注意:此处用没有创建用户的 test_db 进行登录,实际中需要注意数据库安全

增强链接

增强的更加方便了,直接输入表单中的数据即可。

三、在 Prisma 中使用 mongoDB 集群

1) 安装依赖

pnpm add prisma @prisma/client

2) 初始化

pnpx primsa init

生成:

env 环境变量(待会需要修改)
/prisma/prisma.schemaschema 文件(根据自己的需求改)

3) 生成客户端

pnpx prisma generate

4) pnpm 中添加前置脚本

{
    \"scripts\": {
        \"postinstall\": \"npm prisma generate\"
    }
}

添加了前置脚本就会每次执行了 pnpm add/pnpm i 命令之后重新只执行 ,在部署的时候非常有用。

5) 修改 prisma.schema 并定义 User 文件

以下是一个示例:

generator client {
  provider = \"prisma-client-js\"
  output = \"../node_modules/.prisma\"
}

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

model User {
  id String @id @default(auto()) @map(\"_id\") @db.ObjectId
  username String
  password String
  email String @unique
  role String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

指定了 Primsa ORM 客户端的生成地址在 ../node_modules 中(使用 pnpm workspace) 推荐修改
指定了 MongoDB 数据库
指修改 .env 环境变量自定为 MongoDB 集群地址

DATABASE_URL=\"mongodb://localhost:27017/test_db?readPreference=primary&ssl=false&directConnection=true\"

在修改完毕之后重新生成 Primsa ORM 客户端, 生成新客户端。

pnpx prisma generate

四、在 NestJS Service 中提供 CRUD/List/Count 服务

引用客户端和 shema 提供的类型。

import { PrismaClient, User } from \'@@prisma\'; // 在 tsconfig.json 中配置

@@prismapnpm workspace 中运行,所以被重置了地址,为什么需要重置?

因为 pnpm workspace 生成客户端时,都会在 root node_modules 中生成,且会冲突,需要每一个 Prisma ORM 保持单独性,所以需要重置。

// prisma.service.ts

import { Injectable } from \'@nestjs/common\';
import { PrismaClient, User } from \'@@prisma\'; // 在 tsconfig.json 中配置

@Injectable()
export class PrismaService {
  private prisma: PrismaClient;

  constructor() {
    this.prisma = new PrismaClient();
  }

  async createUser({
    username,
    password,
    email,
    role,
  }}): PromiseUser> {
    return this.prisma.user.create({
      data: {
        username,
        password,
        email,
        role,
      },
    });
  }

  async updateUser({
    id,
    password,
  }): PromiseUser | null> {
    return this.prisma.user.update({
      where: { id },
      data: {
        password,
      },
    });
  }

  async deleteUser(id: string): PromiseUser | null> {
    return this.prisma.user.delete({
      where: { id },
    });
  }

  async getUserById(id: string): PromiseUser | null> {
    return this.prisma.user.findUnique({
      where: { id },
    });
  }

  async getList({
    page,
    pageSize,
  }: {
    page: number;
    pageSize: number;
  }): PromiseUser[]> {
    const skip = (page - 1) * pageSize;
    return this.prisma.user.findMany({
      skip,
      take: pageSize,
    });
  }

  async getUsersCount(): Promisenumber> {
    return this.prisma.user.count();
  }
}

以上是基于 Primsa ORM 对于 MongoDB 的基本厂常见的增删改业务。

六、小结

本文旨在介绍如何使用 docker-compose 来入门级编排 MongoDB 副本集(请注意,在使用时务必注意数据库安全性,本文仅为案例)。其次,本文将通过实践演示如何使用 Prisma ORM 和 NestJS 操作数据库。希望本文能帮助读者顺利掌握 MongoDB 副本集的使用方法。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/8942.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号