2025-4I データベース工学 第13回 講義資料

2026年01月29日 (木) 3-4時限

1 連絡と準備

2 学年末試験に関する連絡

学年末試験 (筆記試験) は、2月12日 (木) の2時限目に試験時間 80分 で実施します。

2.0.1 持ち込み品について

img

2.0.2 出題内容と範囲について

3 MongoDB

今回と次回 (学年末試験後) では、ドキュメント指向データベースマネジメントシステム である MongoDB について学んでいきます。 Mongo は「モンゴ」と読みます。

(プロンプト例)

ドキュメント指向データベースとは、どのような特徴を持ったデータベースですか?私は、既に RDB (PostgreSQL) についての基礎の知識と利用経験があるので、それを踏まえて比較しながら解説してください。

ドキュメント指向データベースには、CouchDB や Firestore などがありますが、それらと比較した場合の MongoDB の特徴について解説してください。

3.1 NoSQL

第01回講義でも簡単に触れましたが、データベースのアーキテクチャ (=内部の仕組み/データの整理方法) は、大きく「RDB」と「NoSQL」の2つに分類することができます。

基本的に RDB 以外は、すべて NoSQL に分類される ため、NoSQL には様々な方式のデータベース (ドキュメント型、キー・バリュー型、グラフ型など) が存在します。このなかでも ドキュメント指向データベース に属する MongoDB は、NoSQL を代表するデータベースとして、特に知名度が高く実務でも広く利用されています

MongoDB は、JSON形式 (JSON: JavaScript Object Notation) でデータを扱えるという特性から、ウェブアプリ開発との親和性が高く、APIサーバやバックエンドのデータベースとして採用されるケースが多いことが特徴となっています。

MongoDB は、自前でサーバを用意して運用することも可能ですが、サーバ構築や保守・運用を意識せずに利用できるマネージドサービスとしてMongoDB Atlasも提供されています (簡単に言えば クラウドで提供される MongoDB です)。

(プロンプト例)

MongoDB Atlas とは、どのようなウェブサービスですか?ウェブアプリを個人開発するとき、自前で MongoDB サーバを用意する場合 (セルフホストする場合) と比較して、どのようなメリットがありますか。

「MongoDB Atlas はマネージドデータベースサービスである」といった文脈において、マネージドとは、どのような意味ですか。

3.1.1 定着確認

3.2 MongoDB の特徴

MongoDB は、キーバリュー構造を持った ドキュメント (Document) を基本単位としてデータを管理する方式のデータベースになります。MongoDB において、1件1件のデータは「ドキュメント」という単位で扱われ、RDB との大きな違いとして、ドキュメント内部に 「入れ子構造」や「配列構造」をそのまま含められること が挙げられます。

より具体的には、MongoDB における「ドキュメント」は表面的には JSON形式のデータ で表現されます。そのため、RDB では複数テーブルに分割して管理していたようなデータ構造も、次のように 1つのドキュメント としてまとめて保持することができます。

{
  "_id": ObjectId("65f0c9e2b3a1c8a1d4e12345"),
  "character_id": 1,
  "name": "Marvin",
  "job": {
    "job_id": 5,
    "name": "Priest"
  },
  "items": [
    {
      "item_id": 1,
      "name": "Potion",
      "qty": 3
    },
    {
      "item_id": 5,
      "name": "Mana Potion",
      "qty": 1
    }
  ],
  "level": 35,
  "created_at": ISODate("2025-01-10T12:00:00Z")
}

このようなドキュメントは、MongoDB の内部では BSON (Binary JSON) 形式で保存・管理されています。BSON(ビーソン)は、JSON を拡張した バイナリ形式のデータ表現 であり、「型情報」や「長さ情報」を持つことで、高速なアクセスや効率的なデータ管理が可能 となっています。

概念的には、RDB における 行・レコード が MongoDB における「ドキュメント」に対応します。同様に、RDB における「テーブル」が、MongoDB では 「コレクション」 とよばれます。

また、MongoDB は「スキーマレス」という特徴を持ちます。RDB のように厳密なスキーマを事前に定義する必要がなく、同じコレクションのなかに 異なる構造のドキュメントを格納可能 となっています。このような柔軟性から、アジャイル開発や、仕様変更が頻繁に発生するウェブアプリケーションとも相性がよいデータベースとなっています。

(プロンプト例)

ソフトウェア開発の文脈において「アジャイル開発」とは、どのような開発手法ですか。

3.2.1 定着確認

4 MongoDB 演習環境のセットアップ

Dockerコンテナを利用した MongoDB の演習環境をセットアップします。こちらのリポジトリ の Readme を参照しながらセットアップと動作確認をしてください。

(プロンプト例)

MongoDB について学ぼうと思っています。mongo-express とは、何のために使用する、どのようなツールですか?

MongoDB について学ぼうと思っています。mongosh とは、何のために使用する、どのようなツールですか?

MongoDB について学ぼうと思っています。mongoose とは、何のために使用する、どのようなライブラリですか?

MongoDB について学ぼうと思っています。MongoDB Compass とは、何のために使用する、どのようなツールですか?

4.0.1 定着確認

5 mongosh による MongoDB の操作

PostgreSQL では、psql という CLI (Command Line Interface) の公式ツールを用いて、対話的にデータベースの管理操作をしたり、SQL クエリを発行したりできました (第02回講義)。

MongoDB においても、これと同様の役割を持つ公式 CLI ツールとして mongosh (モンゴシェル) が提供されています。この mongosh を利用することで、MongoDB に接続し、対話的に各種管理操作やクエリ発行をすることができます。

実際に mongosh を起動して MongoDB を操作してみます。

なお、現在の環境では MongoDB はコンテナ内で稼働しており、ホスト側 (Windows 上) には mongosh は存在しません。そのため、MongoDB コンテナ (mongo8) に接続し、コンテナ内部で mongosh を実行します。

5.0.1 定着確認

5.1 mongosh の起動

演習環境のプロジェクトフォルダを VSCode で開いて、ターミナルから次のコマンドを実行してコンテナを起動しておきます。

npm run db:up

Docker Desktop のウィンドウを表示し、左パネルの Containers を選択します。さらに mongo8 コンテナの「三点リーダ」をクリックして「Open in terminal」を選択します。

img

コンテナに接続されたターミナルが表示されるので、以下のように認証情報を添えて mongosh を入力して [Enter] を押下します。

mongosh -u student -p secret123 --authenticationDatabase admin

次のように mongosh が起動し、対話的に操作ができる状態になります。

img

ここで test> という表示は、mongosh が 現在「test データベース」を対象としてコマンドを受け付けている状態 であることを表しています (test は、デフォルトで選択されるデータベースの名前です)。この表示は、使用するデータベースを切り替えると変化します。

5.2 データベースの選択とコレクションの削除

次のコマンドを入力して、データベースを playground に切り替えます。playgrounddocker/docker-compose.yaml のなかで、環境変数 MONGO_INITDB_DATABASE に設定しているデータベースの名前です。

use playground

実行すると、以下のような応答があるはずです。

switched to db playground
playground>

このデータベースのなかに s_users というコレクション (RDBで言うところの テーブル に相当) を作成していきます。

その前準備として、同名のコレクションが存在する場合は削除 しておきます。以下のコマンドは、s_users コレクションが存在すれば削除し、存在しない場合は false を返すものになります。

db.s_users.drop();

5.3 ドキュメントの挿入

MongoDB では、ドキュメントを作成する際に、自動的にコレクションが作成されます。3件のドキュメントを挿入してみます。以下を貼付けてください。

db.s_users.insertMany([
  { name: "Alice", level: 20 },
  { name: "Bob", level: 22 },
  { name: "Carol", level: 19 },
]);

次のような応答がかえってきます。

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('6979d36a02e36dd8878de666'),
    '1': ObjectId('6979d36a02e36dd8878de667'),
    '2': ObjectId('6979d36a02e36dd8878de668')
  }
}

次の応答は insertMany() によるドキュメント挿入が正常に完了したことを示しています。

まず、acknowledged: true は、MongoDB サーバがこの書き込み操作を正しく受け付け、完了したことを保証していることを意味します。次に、insertedIds には、今回挿入された各ドキュメントに自動的に割り当てられた _id の一覧が含まれています。

MongoDBの _id について

MongoDB では、ドキュメントの挿入時に _id を明示的に指定しなかった場合、自動的に ObjectId型 の一意な識別子が生成されます。上記で表示されている ObjectId('6979d36a02e36dd8878de666') などが、それに該当します。

5.3.1 定着確認

5.4 ドキュメントの抽出

s_users コレクションからレベルが「20以上」のユーザを抽出してみます。ここで使用している printjson は、JavaScript オブジェクトを整形して見やすく出力するための mongosh の補助関数になります。

printjson(
  db.s_users
    .find({ level: { $gte: 20 } }) // Lv. が 20 以上のユーザを抽出
    .sort({ level: -1 }) // Lv. の降順で整列
    .toArray(),
);

この例では…

…しています。

実行すると、次のような応答が返ってきます。

[
  {
    _id: ObjectId('6979d3e5d53c0e2c7c8de667'),
    name: 'Bob',
    level: 22
  },
  {
    _id: ObjectId('6979d3e5d53c0e2c7c8de666'),
    name: 'Alice',
    level: 20
  }
]

ここで、一旦、.exit を入力し、mongosh CLI を抜けます (先頭にドットを付けるのを忘れないようにしてください)。

プロンプトが playground> から # に切り替われば、mongosh は正しく終了しています。

5.5 VSCode から mongosh にスクリプトを送信

以上で説明した手順で MongoDB を操作することができますが、かなり煩雑なものとなります。そこで、演習環境では *.mongosh.js というファイルを作成し、そこに記述したスクリプトを コンテナの mongosh に流し込んで実行できるように しています。

mongosh/14/sample.mongosh.js を作成し、以下を貼付けてください。

db.s_users.drop();

db.s_users.insertMany([
  { name: "Alice", level: 20 },
  { name: "Bob", level: 22 },
  { name: "Carol", level: 19 },
]);

printjson(
  db.s_users
    .find({ level: { $gte: 20 } })
    .sort({ level: -1 })
    .toArray(),
);

上記のスクリプト (実体は JavaScript) は、VSCode のターミナルから、次のコマンドで実行することが (=コンテナ mongo8 の mongosh に流し込むことが) できます。もしくは [Ctrl]+[Shift]+[B] でも実行できます。

npm run mql mongosh/14/sample.mongosh.js 

(プロンプト例)

VSCode で mongosh 用のスクリプトを記述していたら、ESLint から大量のエラーや警告がでました。なぜ、このようになるのですか。

5.6 コレクションの確認

http://localhost:8081/から mongo-express に接続して、上記で作成したコレクションとドキュメントについて確認してください。

5.6.1 定着確認

6 演習

演習環境を利用して MongoDB における CRUD の基本について学んでください。

(プロンプト例)

あなたは、実務経験豊富で理論と実践のバランスに優れたIT講師です。
MongoDB の CRUD の基本について、初学者 (ただし RDB については経験あり) を対象としたハンズオン形式の講義をしてください。
## 前提条件
- MongoDB のインストールおよび環境構築は完了している
- mongosh は起動済みで、使用するデータベースもすでに選択されている
- MongoDB の JavaScript API のみを使用する。文末には ; を付ける
- mongosh のメタコマンドは一切使用しないこと
- RDB との対比を適宜交えながら説明すること
- 実際に手を動かしながら理解できるように、コード例 → 実行結果のイメージ → 補足説明の流れを意識すること

まずは Create: insertOneinsertMany の使い分けからハンズオン形式の講義をしてください。

つづいて Read: findfindOne とクエリ演算子 ($eq$gt$in) についてハンズオン形式の講義をしてください。

つづいて Update: updateOneupdateManyreplaceOne についてハンズオン形式の講義をしてください。

つづいて Delete: deleteOnedeleteMany についてハンズオン形式の講義をしてください。

7 授業時間外学習の指示

🚨本科目は「学修単位科目」であり、1回の講義あたり「4時間相当」の授業時間外学習が求められる科目です🏃