mcpField
M
mongodb-atlas

mongodb-atlas

github.com/thelobbiデータ・データベース2151 回インストール1 日前に更新
リポジトリ

mongodb-atlas について

mongodb-atlasは、MongoDBとMongoDB Atlasを扱う開発者向けのスキルです。Prisma、インデックス、集計、性能分析、Atlas CLIによる管理の例を収録しています。

主な機能

  1. 01MongoDBのクエリとスキーマ例
  2. 02集計パイプラインのパターン
  3. 03Prisma MongoDB操作
  4. 04インデックスとクエリの最適化
  5. 05Atlas CLIのクラスターコマンド

活用シーン

  1. 01MongoDBのスキーマとコレクション設計
  2. 02メンバー集計レポートの作成
  3. 03インデックス利用状況と低速クエリの分析
  4. 04Atlas CLIによるクラスター管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/thelobbi/claude --skill mongodb-atlas

インストール後、Claude Code で/mongodb-atlasを入力して読み込まれたか確認します。

詳細

MongoDB Atlas スキル

Alpha Members Platform 向けに、MongoDB と MongoDB Atlas の包括的な機能を提供します。

このスキルを使用するタイミング

次の作業を行うときに、このスキルを有効にします。

  • MongoDB クエリの開発
  • スキーマの設計とモデリング
  • 集約パイプライン
  • インデックスの最適化
  • Prisma と MongoDB の統合
  • Atlas クラスターの管理
  • データベースのパフォーマンスチューニング

クイックリファレンス

Docker コマンド
# Start local MongoDB
docker-compose up mongodb -d

# Connect to MongoDB shell
docker exec -it mongodb mongosh -u root -p rootpassword

# Check MongoDB logs
docker logs mongodb -f --tail=100
MongoDB シェルコマンド
// Switch to database
use member_db

// List collections
show collections

// Find documents
db.members.find({ status: "ACTIVE" }).limit(10)

// Insert document
db.members.insertOne({ email: "[email protected]", status: "PENDING" })

// Update document
db.members.updateOne(
  { email: "[email protected]" },
  { $set: { status: "ACTIVE" } }
)

// Aggregation
db.members.aggregate([
  { $match: { status: "ACTIVE" } },
  { $group: { _id: "$profile.company", count: { $sum: 1 } } }
])
接続文字列
# Local Docker
mongodb://root:rootpassword@localhost:27017/member_db?authSource=admin

# Atlas (example)
mongodb+srv://user:[email protected]/member_db?retryWrites=true&w=majority

スキーマ設計

Prisma MongoDB スキーマ
datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

model Member {
  id              String          @id @default(auto()) @map("_id") @db.ObjectId
  keycloakUserId  String          @unique
  email           String          @unique
  firstName       String
  lastName        String
  status          MemberStatus    @default(PENDING)
  profile         MemberProfile?  // Embedded
  addresses       MemberAddress[] // Embedded array
  memberships     Membership[]    // Relation
  createdAt       DateTime        @default(now())
  updatedAt       DateTime        @updatedAt

  @@index([status])
  @@index([email])
}

type MemberProfile {
  jobTitle    String?
  company     String?
  timezone    String  @default("UTC")
}

type MemberAddress {
  type        AddressType
  street1     String
  city        String
  state       String
  postalCode  String
}

コレクション

members
{
  _id: ObjectId("..."),
  keycloakUserId: "uuid",
  email: "[email protected]",
  firstName: "John",
  lastName: "Doe",
  status: "ACTIVE",
  profile: {
    jobTitle: "Engineer",
    company: "Acme Corp"
  },
  addresses: [
    { type: "HOME", street1: "123 Main St", ... }
  ],
  createdAt: ISODate("..."),
  updatedAt: ISODate("...")
}
memberships
{
  _id: ObjectId("..."),
  memberId: ObjectId("..."),
  type: "INDIVIDUAL",
  level: "PREMIUM",
  status: "ACTIVE",
  startDate: ISODate("..."),
  payment: {
    method: "card",
    amount: 99.99,
    currency: "USD"
  }
}
member_activities
{
  _id: ObjectId("..."),
  memberId: ObjectId("..."),
  action: "LOGIN",
  category: "AUTH",
  ipAddress: "192.168.1.1",
  createdAt: ISODate("...")
}

インデックス

推奨インデックス
// Members collection
db.members.createIndex({ keycloakUserId: 1 }, { unique: true })
db.members.createIndex({ email: 1 }, { unique: true })
db.members.createIndex({ status: 1, createdAt: -1 })
db.members.createIndex({ "profile.company": 1 })

// Text search
db.members.createIndex({
  firstName: "text",
  lastName: "text",
  email: "text",
  "profile.company": "text"
})

// Memberships
db.memberships.createIndex({ memberId: 1 })
db.memberships.createIndex({ status: 1, endDate: 1 })

// Activities (with TTL)
db.member_activities.createIndex({ memberId: 1, createdAt: -1 })
db.member_activities.createIndex(
  { createdAt: 1 },
  { expireAfterSeconds: 31536000 } // 1 year TTL
)

集約パイプライン

メンバー統計
db.members.aggregate([
  { $facet: {
      byStatus: [
        { $group: { _id: "$status", count: { $sum: 1 } } }
      ],
      byMonth: [
        { $group: {
            _id: { $dateToString: { format: "%Y-%m", date: "$createdAt" } },
            count: { $sum: 1 }
          }
        },
        { $sort: { _id: 1 } }
      ],
      total: [{ $count: "count" }]
    }
  }
])
メンバーとメンバーシップ
db.members.aggregate([
  { $match: { _id: ObjectId("...") } },
  { $lookup: {
      from: "memberships",
      localField: "_id",
      foreignField: "memberId",
      as: "memberships"
    }
  }
])

Prisma 操作

// Find member
const member = await prisma.member.findUnique({
  where: { email: "[email protected]" },
  include: { memberships: true }
});

// Create member with embedded profile
const newMember = await prisma.member.create({
  data: {
    email: "[email protected]",
    firstName: "Jane",
    lastName: "Doe",
    keycloakUserId: "uuid",
    profile: {
      jobTitle: "Manager",
      company: "Acme"
    }
  }
});

// Update with push to array
const updated = await prisma.member.update({
  where: { id: "..." },
  data: {
    addresses: {
      push: {
        type: "WORK",
        street1: "456 Office Blvd",
        city: "Boston",
        state: "MA",
        postalCode: "02102"
      }
    }
  }
});

// Aggregation with Prisma
const stats = await prisma.member.groupBy({
  by: ['status'],
  _count: true
});

パフォーマンスの最適化

クエリの最適化
// Use projection to limit returned fields
db.members.find(
  { status: "ACTIVE" },
  { firstName: 1, lastName: 1, email: 1 }
)

// Use covered queries
db.members.find(
  { email: "[email protected]" },
  { _id: 0, email: 1, status: 1 }
).hint({ email: 1, status: 1 })

// Explain query plan
db.members.find({ status: "ACTIVE" }).explain("executionStats")
インデックスの分析
// Get index usage stats
db.members.aggregate([{ $indexStats: {} }])

// Find unused indexes
db.members.aggregate([
  { $indexStats: {} },
  { $match: { "accesses.ops": 0 } }
])

Atlas CLI コマンド

# Login to Atlas
atlas auth login

# List clusters
atlas clusters list --projectId <projectId>

# Create cluster
atlas clusters create alpha-dev \
  --projectId <projectId> \
  --provider AWS \
  --region US_EAST_1 \
  --tier M10

# Get connection string
atlas clusters connectionStrings describe alpha-dev

プロジェクトファイル

  • Prisma スキーマ:prisma/schema.prisma
  • MongoDB 初期化:infrastructure/mongo-init/01-init-db.js
  • Docker:docker/docker-compose.yml(mongodb サービス)

関連エージェント

  • mongodb-atlas-admin - クラスター管理
  • mongodb-schema-designer - スキーマ設計
  • mongodb-query-optimizer - パフォーマンスチューニング
  • mongodb-aggregation-specialist - 複雑なクエリ

トラブルシューティング

# Check MongoDB connection
docker exec mongodb mongosh --eval "db.adminCommand('ping')"

# Check replication status
docker exec mongodb mongosh --eval "rs.status()"

# Analyze slow queries
db.setProfilingLevel(1, { slowms: 100 })
db.system.profile.find().sort({ millis: -1 }).limit(10)

コメント