0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MongoDB Atlasで始めるクラウドNoSQL入門

0
Posted at

はじめに

MongoDB Atlasは、クラウド上でMongoDBをフルマネージドで提供するサービスで、インフラ管理なしに高可用・高セキュリティなドキュメントDBを使えるプラットフォームです。
ここでは、用語の意味をやさしい日本語で説明しながら、Node.jsを中心としたコード例つきで、15章構成でAtlasの世界を案内していきます。


第1章 MongoDB Atlasとは何か

MongoDB Atlasは、AWS・Azure・GCPのいずれか(または複数)上にMongoDBクラスターを数クリックで構築し、スケーリング・バックアップ・監視・セキュリティなどを自動で面倒見てくれるマネージドサービスです。
開発者はサーバーやOSのセットアップを気にせず、ドキュメント指向のMongoDB APIだけに集中できるため、スタートアップからエンタープライズまで、スピード重視の開発に広く採用されています。

# Node.js プロジェクト作成とドライバ導入
mkdir atlas-demo && cd atlas-demo
npm init -y
npm install mongodb dotenv

第2章 クラスタ作成と接続文字列の理解

Atlasでは、最小構成でもレプリカセット(3ノード構成)としてデプロイされ、自動フェイルオーバーや監視が標準で有効になっているため、高可用なクラスターを簡単に持てます。
クラスタ作成後に発行される接続文字列(MongoDB URI)には、ホスト名・データベース名・認証情報・接続オプションなどが含まれ、アプリからの接続設定の要となります。

# .env
MONGODB_URI="mongodb+srv://<user>:<password>@cluster0.xxxxx.mongodb.net/myapp?retryWrites=true&w=majority"
// db.js
require('dotenv').config();
const {MongoClient} = require('mongodb');

const client = new MongoClient(process.env.MONGODB_URI);

async function connect() {
  await client.connect();
  console.log('Connected to MongoDB Atlas');
  return client.db('myapp');
}

module.exports = {connect};

第3章 ドキュメントモデルとコレクション

MongoDBはRDBの「行」に相当するデータをJSONライクなドキュメントとして保存し、同種のドキュメントを入れる箱をコレクションと呼びます。
スキーマは柔軟で、同じコレクションでもフィールド構造が少しずつ違っても保存できますが、Atlasではスキーマ推論やバリデーション機能を使って、ある程度の構造ルールを付けることも可能です。

// sampleInsert.js
const {connect} = require('./db');

async function main() {
  const db = await connect();
  const users = db.collection('users');

  const doc = {
    name: 'Taro',
    email: 'taro@example.com',
    tags: ['admin', 'beta'],
    profile: {age: 29, city: 'Tokyo'},
    createdAt: new Date(),
  };

  const result = await users.insertOne(doc);
  console.log('Inserted id:', result.insertedId);
}

main().catch(console.error);

第4章 基本的なCRUD操作

Atlasクラスターも通常のMongoDBと同じく、insert, find, update, deleteといったCRUD操作をドライバ経由で行います。
Node.js用公式ドライバではPromiseベースのAPIが用意されており、findでカーソルを取得してtoArrayで配列化するなど、JavaScriptに馴染みやすい感覚でクエリを書けます。

// crud.js
const {connect} = require('./db');

async function crudExample() {
  const db = await connect();
  const posts = db.collection('posts');

  // 作成
  await posts.insertMany([
    {title: 'Hello Atlas', views: 10},
    {title: 'Second Post', views: 5},
  ]);

  // 読み取り
  const all = await posts.find({}).toArray();
  console.log('All posts:', all);

  // 更新
  await posts.updateOne({title: 'Hello Atlas'}, {$inc: {views: 1}});

  // 削除
  await posts.deleteOne({title: 'Second Post'});
}

crudExample().catch(console.error);

第5章 インデックスとパフォーマンス

ドキュメント数が増えると、クエリを高速化するためにインデックスが重要となり、AtlasではダッシュボードからGUIで作成したり、ドライバ経由でプログラム的に定義できます。
アクセスパターンに合わせて単一フィールド・複合・テキスト・TTLなどのインデックスを設けることで、読み取り性能を大きく向上させ、Atlasのメトリクスと組み合わせてボトルネックを分析できます。

// indexSetup.js
const {connect} = require('./db');

async function setupIndexes() {
  const db = await connect();
  const posts = db.collection('posts');

  // titleにユニークインデックス
  await posts.createIndex({title: 1}, {unique: true});

  // createdAtで降順ソートするクエリ向け
  await posts.createIndex({createdAt: -1});

  console.log('Indexes created');
}

setupIndexes().catch(console.error);

第6章 Atlasのセキュリティとネットワークアクセス

AtlasはデフォルトでIPアクセスリスト・ユーザー認証・暗号化通信(TLS/SSL)が有効で、パブリックインターネットからの接続をIPまたはVPCピアリングで絞り込めます。
データは保存時に暗号化され、必要に応じてカスタマー管理キー(KMS連携)も設定できるため、金融や医療のような高いセキュリティ要件にも対応しやすい構造です。

# 接続テスト(IP許可済み・ユーザー作成済みが前提)
node crud.js
// 役割ベースのユーザー例(Atlas UIで設定)
// appUser: readWrite 役割を myapp データベースに付与

第7章 Mongooseを使ったスキーマ定義

Node.jsでは、MongoDBドライバに加えてMongoose ODMを使うと、スキーマ定義やバリデーション、ミドルウェアなどを活用したモデル指向の開発ができます。
AtlasとMongooseを組み合わせれば、クラウド管理のMongoDB上に、型とルールを持ったコレクションを構築でき、アプリが大きくなってもデータ構造を統一しやすくなります。

npm install mongoose
// mongoose.js
require('dotenv').config();
const mongoose = require('mongoose');

mongoose.connect(process.env.MONGODB_URI);

const userSchema = new mongoose.Schema(
  {
    name: {type: String, required: true},
    email: {type: String, required: true, unique: true},
    age: Number,
  },
  {timestamps: true}
);

const User = mongoose.model('User', userSchema);

async function run() {
  const doc = await User.create({name: 'Hanako', email: 'hana@example.com'});
  console.log('Saved user:', doc);
}

run().catch(console.error);

第8章 Aggregationパイプラインでの集計

MongoDBのAggregationパイプラインは、複数ステージの処理をつなげて、グループ化・絞り込み・ソート・集計などを強力に行える機能で、Atlasでも同じ構文を使います。
売上集計やイベントログの分析など、SQLのGROUP BYに相当する処理を柔軟に書けるため、アプリ側での後処理を減らし、データベース側に負荷を適切に分散できます。

// aggregate.js
const {connect} = require('./db');

async function aggregateExample() {
  const db = await connect();
  const orders = db.collection('orders');

  const pipeline = [
    {$match: {status: 'completed'}},
    {$group: {_id: '$customerId', total: {$sum: '$amount'}}},
    {$sort: {total: -1}},
  ];

  const results = await orders.aggregate(pipeline).toArray();
  console.log('Top customers:', results);
}

aggregateExample().catch(console.error);

第9章 MongoDB Atlas Searchと全文検索

Atlas Searchは、Luceneベースのフルテキスト検索機能をAtlasクラスターに統合したもので、インデックス構築だけで高度な検索が利用できるサービスです。
$searchステージをAggregationに追加することで、キーワード検索・スコアリング・ファセットなどを、アプリ側の自前エンジンなしで実現できます。

// search.js
const {connect} = require('./db');

async function searchPosts(query) {
  const db = await connect();
  const posts = db.collection('posts');

  const pipeline = [
    {
      $search: {
        index: 'default',
        text: {query, path: ['title', 'body']},
      },
    },
    {$limit: 5},
  ];

  const results = await posts.aggregate(pipeline).toArray();
  console.log('Search results:', results);
}

searchPosts('Atlas').catch(console.error);

第10章 Atlas Vector SearchとAI連携

Atlas Vector Searchは、埋め込みベクトルを保存・検索する機能で、QAボットやレコメンドなどAIアプリの「類似検索」部分を担います。
OpenAIなどで生成したベクトルをドキュメントに保存し、$vectorSearchステージで類似度の高いものから取得すれば、RAG(検索拡張生成)などのパターンをAtlasのみで完結できます。

// ベクトルを持つドキュメントの挿入例(概念的なコード)
const doc = {
  content: 'MongoDB Atlas is a multi-cloud database service.',
  embedding: [0.12, -0.03, /* ... */],
};
await db.collection('docs').insertOne(doc);

// 類似ドキュメント検索(疑似的なパイプライン例)
const pipeline = [
  {
    $vectorSearch: {
      index: 'vector_index',
      queryVector: queryEmbedding,
      path: 'embedding',
      numCandidates: 100,
      limit: 5,
    },
  },
];

第11章 MongoDB Atlas App Servicesとトリガー

Atlas App Services(旧Realm)は、サーバーレスファンクション・トリガー・Syncなどを提供し、DBイベントに連動したバックエンドロジックをコードだけで構築できます。
ドキュメントの挿入や更新をトリガーに、メール送信や外部API呼び出しを行ったり、スケジュール実行でバッチ処理を行うなど、アプリ側にサーバーを用意せずに柔軟な拡張が可能です。

// App ServicesのFunction(ダッシュボードで記述するJavaScriptの例)
exports = async function(changeEvent) {
  const fullDocument = changeEvent.fullDocument;
  console.log('New order created:', fullDocument._id, fullDocument.amount);
  // TODO: 外部APIに通知など
};

第12章 監視・バックアップと運用機能

AtlasはメトリクスダッシュボードでCPU・メモリ・I/O・クエリ性能などをリアルタイムに確認でき、しきい値を超えた際のアラート通知も設定できます。
バックアップは連続バックアップやポイントインタイムリカバリに対応しており、誤削除や障害時にも指定時刻へ戻せるため、ビジネスクリティカルなアプリの安全網として機能します。

# Atlas UIで設定する例
- Projects > Alerts でCPU使用率や接続数のアラートを設定
- Backupタブでスナップショット頻度や保持期間を指定

第13章 マルチリージョン・マルチクラウド展開

Atlasでは、同じクラスターを複数リージョンや複数クラウドプロバイダに跨って配置でき、ユーザーに近い場所から低レイテンシでデータを提供できます。
耐障害性や規制対応(データ所在地要件)にも強く、リージョン障害が起きても自動フェイルオーバーで別リージョンに切り替わる構成を比較的容易に組めます。

# Atlas UI での概念的な手順
- Cluster > Edit Configuration > Global Cluster
- 追加リージョンを選択し、Read/Writeの役割を指定

第14章 セキュアな運用ベストプラクティス

安全なAtlas運用のためには、IPアクセスリストで最小限のIPだけを許可し、アプリケーションごとに最小権限のDBユーザーを発行することが推奨されます。
また、監査ログやアラートを有効にし、異常なクエリやログイン試行を検知できるようにすることで、潜在的な侵入や内部不正に早期に気付ける体制を整えられます。

# 代表的な設定チェックリスト
- すべてのユーザーに強制認証を必須化
- アプリ用ユーザーにはreadWriteなど必要最小限のロールのみ付与
- 「Allow Access from Anywhere」を避け、CIDRで限定
- 監査ログ・アラート・暗号化設定を確認

第15章 まとめと次のステップ

MongoDB Atlasは、クラウドネイティブなドキュメントDB運用をほぼクリックだけで始められ、スケーリング・セキュリティ・バックアップ・検索・AI連携など周辺機能も一体となった強力なプラットフォームです。
まずは無料枠クラスターを作成し、ここで紹介したNode.jsの接続とCRUDから始めて、徐々にインデックス・Aggregation・Search・Vector SearchやApp Servicesを試しながら、自分のアプリに最適なAtlasアーキテクチャを探っていくと良いでしょう。

// これからの実験用に最低限のエントリポイント
const {connect} = require('./db');

async function main() {
  const db = await connect();
  const items = db.collection('items');
  await items.insertOne({title: 'First Item', createdAt: new Date()});
  const list = await items.find().toArray();
  console.log('Items:', list);
}

main().catch(console.error);
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?