1 連絡と準備
- 高専テクノゼミ「実践教育プログラム2026春」のエントリが開始されています。
- 高専テクノゼミ「進路選択の部屋」
- 案内ページ
- 日時: 2026年3月6日(金) 10:00~17:30
- 場所: 東京大学
2 学年末試験に関する連絡
学年末試験 (筆記試験) は、2月12日 (木) の2時限目に試験時間 80分 で実施します。
2.0.1 持ち込み品について
- よく消える消しゴム と 直定規 を準備してください。
- A4サイズ1枚の手書きのメモ (両面使用可・色ペンなど使用可)
を持ち込み可とします。持ち込みメモは、答案とともに提出してもらいます
(採点後に答案とともに返却します)。
- 「A4」よりも小さなサイズは、持ち込みは不可 なので注意ください。
- 片面の 右上部に横10cm、縦1.5cmの四角枠 を作成して、そのなかに
XX番 高専 太郎の形式で出席番号とフルネーム氏名を記入してください。四角枠内には、それ以外の情報を記入しないでください。 - 出席番号と氏名の枠がないメモ、手書き以外で作成したメモ (プリントアウトやコピー) の持ち込みは 不正行為 として扱います。
- ルーズリーフなども、A4サイズのものであれば使用可能です。
- 出席番号と氏名の枠線、罫線や方眼などは印刷でも問題ありません。
2.0.2 出題内容と範囲について
- 第01回講義 から 第14回講義 (今回) までの内容が出題範囲となります。
- MongoDB を操作するコード (=mongosh 上で実行する具体的なコード) を問う問題については出題しません。
- 本科目は、学修単位科目であり、その授業時間外学習を前提とした「難易度」で試験問題を作成しています。
- 主として「定着確認」と「SQLドリル」から出題します。ただし、そのままの出題ではなく類題や解答形式を変更した問題となることも想定してください。
- 実施済みの「小テスト」についても、十分に復習しておいてください。特に、どのような問題で、どのような間違いをしたのか、は振り返っておいてください。
- 小テストでは部分点 (部分正解) となっていた解答も、試験では誤答 (部分点なし) として扱う場合がある ので注意してください。
3 MongoDB
今回と次回 (学年末試験後) では、ドキュメント指向データベースマネジメントシステム である MongoDB について学んでいきます。 Mongo は「モンゴ」と読みます。
- ドキュメント指向データベース (Document-oriented Database) は、一般に「ドキュメント型データベース」とも呼ばれます。
(プロンプト例)
ドキュメント指向データベースとは、どのような特徴を持ったデータベースですか?私は、既に 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 公式HP)
MongoDB は、自前でサーバを用意して運用することも可能ですが、サーバ構築や保守・運用を意識せずに利用できるマネージドサービスとしてMongoDB Atlasも提供されています (簡単に言えば クラウドで提供される MongoDB です)。
- MongoDB Atlas はクレジットカード登録不要で、無料利用枠もあるので、個人開発のウェブアプリなどでも採用されることが多いです。
- この授業では MongoDB Atlas (DBaaS: Database as a Service) は利用せず、MongoDB の Docker コンテナ を使用します。
(プロンプト例)
MongoDB Atlas とは、どのようなウェブサービスですか?ウェブアプリを個人開発するとき、自前で MongoDB サーバを用意する場合 (セルフホストする場合) と比較して、どのようなメリットがありますか。
「MongoDB Atlas はマネージドデータベースサービスである」といった文脈において、マネージドとは、どのような意味ですか。
3.1.1 定着確認
- MongoDB 社が提供する「クラウド上で MongoDB
を管理・運用できるマネージドデータベースサービス」の名称を答えよ。
- 答え: MongoDB Atlas
- MongoDB 以外の代表的なドキュメント指向データベースの名称を1つ挙げよ。
- 答え: CouchDB、Firestore
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 のように厳密なスキーマを事前に定義する必要がなく、同じコレクションのなかに 異なる構造のドキュメントを格納可能 となっています。このような柔軟性から、アジャイル開発や、仕様変更が頻繁に発生するウェブアプリケーションとも相性がよいデータベースとなっています。
- MongoDB の名称は、英語の Humongous (=非常に大きい) に由来するとされています。
(プロンプト例)
ソフトウェア開発の文脈において「アジャイル開発」とは、どのような開発手法ですか。
3.2.1 定着確認
- データモデルの観点から見たとき、RDB における「レコード (行)」に対応する MongoDB
の基本的なデータ単位を答えよ。カタカナもしくは英語で答えよ。
- 答え: ドキュメント、Document
- データモデルの観点から見たとき、RDB における「テーブル」に対応する MongoDB
の基本的なデータ単位を答えよ。カタカナもしくは英語で答えよ。
- 答え: コレクション、Collection
- MongoDB において、JSON
を拡張し、バイナリ表現によって効率的な保存や高速な処理を可能にしたデータ形式を何というか。アルファベット4文字で答えよ。
- 答え: BSON
- データベースにおいて「スキーマレスである」とは、「同じデータ集合内のすべてのデータが、同一の構造を持つことが保証されていること」を意味する。この説明は「適切である」か「適切ではない」か答えよ。
- 答え: 適切ではない
4 MongoDB 演習環境のセットアップ
Dockerコンテナを利用した MongoDB の演習環境をセットアップします。こちらのリポジトリ の Readme を参照しながらセットアップと動作確認をしてください。
(プロンプト例)
MongoDB について学ぼうと思っています。mongo-express とは、何のために使用する、どのようなツールですか?
MongoDB について学ぼうと思っています。mongosh とは、何のために使用する、どのようなツールですか?
MongoDB について学ぼうと思っています。mongoose とは、何のために使用する、どのようなライブラリですか?
MongoDB について学ぼうと思っています。MongoDB Compass とは、何のために使用する、どのようなツールですか?
4.0.1 定着確認
- MongoDB
のデータベースやコレクション、ドキュメントの内容を、ウェブブラウザ上から確認したり、クエリを発効したりすことができる管理用ツールの名称を答えよ。
- 答え: mongo-express
- Node.js 環境において、MongoDB を JavaScript / TypeScript から扱うために用いられる ODM
(Object Data Modeling) ライブラリ の名称を答えよ。
- 答え: mongoose
5 mongosh による MongoDB の操作
PostgreSQL では、psql という CLI (Command Line Interface) の公式ツールを用いて、対話的にデータベースの管理操作をしたり、SQL クエリを発行したりできました (第02回講義)。
MongoDB においても、これと同様の役割を持つ公式 CLI ツールとして mongosh (モンゴシェル) が提供されています。この mongosh を利用することで、MongoDB に接続し、対話的に各種管理操作やクエリ発行をすることができます。
- mongosh は、「Mongo」と「sh (shellの略)」をつなげた語になります。
実際に mongosh を起動して MongoDB を操作してみます。
なお、現在の環境では MongoDB はコンテナ内で稼働しており、ホスト側 (Windows
上) には mongosh は存在しません。そのため、MongoDB コンテナ (mongo8)
に接続し、コンテナ内部で mongosh を実行します。
5.0.1 定着確認
- MongoDB
において、データベースに接続し、対話的に管理操作やクエリの実行を行なうために用いられる 公式
CLI ツールの名称を答えよ。
- 答え: mongosh
5.1 mongosh の起動
演習環境のプロジェクトフォルダを VSCode で開いて、ターミナルから次のコマンドを実行してコンテナを起動しておきます。
npm run db:up
Docker Desktop のウィンドウを表示し、左パネルの Containers
を選択します。さらに mongo8 コンテナの「三点リーダ」をクリックして「Open
in terminal」を選択します。
コンテナに接続されたターミナルが表示されるので、以下のように認証情報を添えて
mongosh を入力して [Enter] を押下します。
mongosh -u student -p secret123 --authenticationDatabase admin
- 上記の
studentとsecret123はdocker/docker-compose.yamlで設定している値です。
次のように mongosh が起動し、対話的に操作ができる状態になります。
ここで test> という表示は、mongosh が 現在「test
データベース」を対象としてコマンドを受け付けている状態 であることを表しています
(test
は、デフォルトで選択されるデータベースの名前です)。この表示は、使用するデータベースを切り替えると変化します。
5.2 データベースの選択とコレクションの削除
次のコマンドを入力して、データベースを playground
に切り替えます。playground は docker/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 定着確認
- MongoDB において、RDB における主キー (PK)
に相当し、各ドキュメントに必ず存在するフィールドの名称を答えよ。
- 答え:
_id
- 答え:
- MongoDB
において、各ドキュメントを一意に識別するために、自動的に付与されるフィールドの名称を答えよ。
- 答え:
_id
- 答え:
5.4 ドキュメントの抽出
s_users
コレクションからレベルが「20以上」のユーザを抽出してみます。ここで使用している
printjson は、JavaScript オブジェクトを整形して見やすく出力するための mongosh
の補助関数になります。
printjson(
db.s_users
.find({ level: { $gte: 20 } }) // Lv. が 20 以上のユーザを抽出
.sort({ level: -1 }) // Lv. の降順で整列
.toArray(),
);
この例では…
find()で条件に合致するドキュメントを抽出し、$gteは Greater Than or Equal の意味
sort()でレベルの高い順 (降順) に並べ替え、toArray()で結果を配列として取得したうえで、printjson()によって内容を確認
…しています。
実行すると、次のような応答が返ってきます。
[
{
_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 を作成し、以下を貼付けてください。
- ファイルの拡張子は必ず
.mongosh.jsとしてください。そうでない場合、ESLint によるエラーや警告が発生します。- 実際に、ファイルネームを
sample.jsに書き換えて、ESLint のチェックにひっかかることを確認してみてください。 - 詳しくは
eslint.config.jsを参照してください。
- 実際に、ファイルネームを
- ファイルを配置するフォルダは必ず
mongosh配下としてください。そうでない場合、ESLint によるエラーや警告が発生します。
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
- この方法で実行した場合、操作対象となるデータベースは、自動的に
playgroundとなります。詳しくはscripts/mqlFileRunner.tsを参照してください。
(プロンプト例)
VSCode で mongosh 用のスクリプトを記述していたら、ESLint から大量のエラーや警告がでました。なぜ、このようになるのですか。
5.6 コレクションの確認
http://localhost:8081/から mongo-express に接続して、上記で作成したコレクションとドキュメントについて確認してください。
5.6.1 定着確認
- ソフトウェア開発におけるツールの操作形態の文脈で「CLI」とは何の略語か。英語で答えよ。
- 答え: Command Line Interface
6 演習
演習環境を利用して MongoDB における CRUD の基本について学んでください。
(プロンプト例)
あなたは、実務経験豊富で理論と実践のバランスに優れたIT講師です。
MongoDB の CRUD の基本について、初学者 (ただし RDB については経験あり) を対象としたハンズオン形式の講義をしてください。
## 前提条件
- MongoDB のインストールおよび環境構築は完了している
- mongosh は起動済みで、使用するデータベースもすでに選択されている
- MongoDB の JavaScript API のみを使用する。文末には;を付ける
- mongosh のメタコマンドは一切使用しないこと
- RDB との対比を適宜交えながら説明すること
- 実際に手を動かしながら理解できるように、コード例 → 実行結果のイメージ → 補足説明の流れを意識することまずは Create:
insertOne、insertManyの使い分けからハンズオン形式の講義をしてください。
つづいて Read:
find、findOneとクエリ演算子 ($eq、$gt、$in) についてハンズオン形式の講義をしてください。
つづいて Update:
updateOne、updateMany、replaceOneについてハンズオン形式の講義をしてください。
つづいて Delete:
deleteOne、deleteManyについてハンズオン形式の講義をしてください。
7 授業時間外学習の指示
🚨本科目は「学修単位科目」であり、1回の講義あたり「4時間相当」の授業時間外学習が求められる科目です🏃