はじめに
この実験 (Lab) では、MongoDB の強力な集計パイプライン (aggregation pipeline) を使用してデータを変換する方法を学びます。集計パイプラインを使用すると、一連のステージを通してデータを処理し、複雑な変換、分析、レポート作成が可能になります。まずサンプルデータセットをセットアップし、次にフィールドの選択と名前の変更、既存データからの新しいフィールドの計算、出力のフォーマット設定、特定の基準に基づくドキュメントのフィルタリングなど、いくつかの主要な変換テクニックを進めていきます。この実験 (Lab) の終わりには、MongoDB 内でデータを操作するための確固たる基盤が得られるでしょう。
セットアップと基本的なフィールド選択
最初のステップでは、MongoDB サーバーに接続し、データベースとコレクションを作成して、サンプルデータを挿入します。その後、ドキュメントから特定のフィールドを選択および名前変更することで、最初のデータ変換を実行します。
まず、ターミナルを開き、MongoDB Shell (mongosh) を起動します。このインタラクティブシェルは、MongoDB インスタンスと対話するための主要な方法です。実験 (Lab) の残りの期間、すべてのデータベース操作はこのシェル内で行います。
mongosh
MongoDB Shell 内に入ると、プロンプトが変更されます。次に、bookstore という名前の新しいデータベースを作成して切り替えます。データベースが存在しない場合、このコマンドで作成されます。
use bookstore
次に、books という名前のコレクションを作成し、insertMany コマンドを使用して 3 つのサンプルドキュメントを挿入します。コレクションはドキュメントのグループであり、SQL データベースのテーブルに似ています。
db.books.insertMany([
{
title: "MongoDB Basics",
author: "Jane Smith",
price: 29.99,
pages: 250,
categories: ["Database", "Programming"]
},
{
title: "Python Deep Dive",
author: "John Doe",
price: 39.99,
pages: 450,
categories: ["Programming", "Python"]
},
{
title: "Data Science Handbook",
author: "Alice Johnson",
price: 49.99,
pages: 600,
categories: ["Data Science", "Programming"]
}
]);
データが準備できたので、集計パイプラインを使用してデータを変換しましょう。aggregate メソッドはステージの配列を受け取り、各ステージはデータに対して操作を実行します。最初のステージは $project で、ドキュメントの形状を変更します。
次のコマンドを実行して、title と author フィールドのみを選択し、それぞれ bookTitle と bookAuthor に名前を変更します。
db.books.aggregate([
{
$project: {
_id: 0,
bookTitle: "$title",
bookAuthor: "$author"
}
}
]);
以下のような出力が表示されるはずです。
[
{ "bookTitle": "MongoDB Basics", "bookAuthor": "Jane Smith" },
{ "bookTitle": "Python Deep Dive", "bookAuthor": "John Doe" },
{ "bookTitle": "Data Science Handbook", "bookAuthor": "Alice Johnson" }
]
$project ステージの内訳を見てみましょう。
_id: 0は、出力からデフォルトの_idフィールドを除外します。デフォルトでは常に含まれます。bookTitle: "$title"は、bookTitleという名前の新しいフィールドを作成し、元のtitleフィールドの値を割り当てます。$プレフィックスは、フィールドの値を参照していることを示します。bookAuthor: "$author"も同様に、authorフィールドをbookAuthorに名前変更します。
新しいフィールドの計算
前のステップでは、既存のフィールドを選択して名前を変更しました。ここでは、既存のデータに対して計算を実行して、まったく新しいフィールドを作成する方法を学びます。これには、元のフィールドを削除せずにドキュメントに新しいフィールドを追加する $addFields ステージを使用します。
本の価格に 10% の税金を含めた priceWithTax という新しいフィールドを追加してみましょう。
db.books.aggregate([
{
$addFields: {
priceWithTax: { $multiply: ["$price", 1.1] }
}
}
]);
出力には、すべての元のフィールドに加えて、各ドキュメントの新しい priceWithTax フィールドが含まれます。
[
{
_id: ObjectId("..."),
title: 'MongoDB Basics',
author: 'Jane Smith',
price: 29.99,
pages: 250,
categories: [ 'Database', 'Programming' ],
priceWithTax: 32.989
},
{
_id: ObjectId("..."),
title: 'Python Deep Dive',
author: 'John Doe',
price: 39.99,
pages: 450,
categories: [ 'Programming', 'Python' ],
priceWithTax: 43.989
},
{
_id: ObjectId("..."),
title: 'Data Science Handbook',
author: 'Alice Johnson',
price: 49.99,
pages: 600,
categories: [ 'Data Science', 'Programming' ],
priceWithTax: 54.989
}
]
このパイプラインでは次のようになります。
$addFieldsは、新しいフィールドを追加するために使用されるステージです。priceWithTaxは、作成している新しいフィールドの名前です。$multiplyは、2 つの数値の配列を受け取り、それらを乗算する集計演算子です。ここでは、priceフィールドの値を1.1で乗算しています。
出力データのフォーマット
データは、適切にフォーマットされていると、より有用になります。このステップでは、$project ステージ内でさまざまな集計演算子を使用して、文字列データと数値データをフォーマットする方法を学びます。これは、アプリケーションやレポートでの表示のためにデータを準備するのに役立ちます。
本のタイトルを大文字に変換し、価格を通貨文字列としてフォーマットすることで、より読みやすい出力を作成しましょう。
db.books.aggregate([
{
$project: {
_id: 0,
titleUpperCase: { $toUpper: "$title" },
formattedPrice: {
$concat: [{ $literal: "$" }, { $toString: "$price" }]
}
}
}
]);
期待される出力は、変換されたデータを示します。
[
{
"titleUpperCase": "MONGODB BASICS",
"formattedPrice": "$29.99"
},
{
"titleUpperCase": "PYTHON DEEP DIVE",
"formattedPrice": "$39.99"
},
{
"titleUpperCase": "DATA SCIENCE HANDBOOK",
"formattedPrice": "$49.99"
}
]
この $project ステージで使用されている演算子を見てみましょう。
$toUpper: この演算子は文字列を大文字に変換します。titleフィールドに適用しました。$concat: この演算子は文字列の配列を連結します。価格にドル記号$のプレフィックスを追加するために使用しました。$literal: この演算子は、そうでなければ式として解釈されるリテラル値を表すために使用されます。ここでは、リテラルのドル記号文字を表すために{ $literal: "$" }を使用しています。$toString:$concatは文字列でのみ機能するため、まず$toString演算子を使用して数値のpriceフィールドを文字列に変換する必要がありました。
$match を使用した結果のフィルタリング
最後に学ぶ基本的なテクニックはフィルタリングです。$match ステージは、SQL の WHERE 句と同様に、特定の条件を満たすドキュメントのみを選択できるようにします。これは、集計パイプラインで最も一般的なステージの 1 つです。
価格が 35 ドルを超えるすべての書籍を見つけましょう。
db.books.aggregate([
{
$match: {
price: { $gt: 35 }
}
}
]);
出力には、フィルターに一致する 2 つの書籍のみが含まれます。
[
{
_id: ObjectId("..."),
title: 'Python Deep Dive',
author: 'John Doe',
price: 39.99,
pages: 450,
categories: [ 'Programming', 'Python' ]
},
{
_id: ObjectId("..."),
title: 'Data Science Handbook',
author: 'Alice Johnson',
price: 49.99,
pages: 600,
categories: [ 'Data Science', 'Programming' ]
}
]
$match ステージは標準の MongoDB クエリ構文を使用します。
price: { $gt: 35 }はフィルター条件を指定します。これは、priceフィールドが 35 より大きい ($gt) ドキュメントを選択します。
ステージを連鎖させて、より複雑なパイプラインを作成することもできます。たとえば、まずドキュメントをフィルタリングし、次にその結果からカスタム出力を投影することができます。
db.books.aggregate([
{
$match: {
price: { $gt: 35 }
}
},
{
$project: {
_id: 0,
title: 1,
price: 1
}
}
]);
このパイプラインは、まず $match を使用して高価な書籍をフィルタリングし、次にその結果に対して $project を使用して title と price のみを表示します。$project の title: 1 という構文は、フィールドを含めるためのショートハンドです。
最終的な出力は、フィルタリングおよび投影されたものです。
[
{ "title": "Python Deep Dive", "price": 39.99 },
{ "title": "Data Science Handbook", "price": 49.99 }
]
MongoDB シェルを終了するには、「exit」と入力するか、「Ctrl+D」を押します。
まとめ
この実験では、MongoDB の集計パイプラインの基本的な操作を学びました。まずデータの挿入から始め、その後一連のステージを使用してデータを変換しました。$project を使用したフィールドの選択と名前の変更、$addFields を使用した新しい計算フィールドの作成、$toUpper や $concat のようなフォーマット演算子を使用したデータの表示形式の変更、$match を使用したドキュメントのフィルタリングを練習しました。これらのステージを組み合わせることで、データベース内で直接データを分析および再形成するための洗練されたデータ処理パイプラインを構築できます。これは、データ操作に対する強力かつ効率的なアプローチです。

