MongoDB 製品データの構造化

MongoDBBeginner
オンラインで実践に進む

はじめに

この実験では、MongoDB を使用して製品データのための構造化されたドキュメントスキーマを設計する基本を学びます。e コマースアプリケーションにとって、適切に設計されたスキーマはパフォーマンスとスケーラビリティのために不可欠です。まず簡単な製品ドキュメントを作成し、価格や在庫情報のような関連データを埋め込んだり、複数値属性に配列を使用したりすることで、徐々に強化していきます。この実験の終わりには、MongoDB データベースで製品データを効果的にモデル化する方法について、確かな理解が得られるでしょう。

基本的な製品ドキュメントの作成

最初のステップでは、MongoDB サーバーに接続し、新しいデータベースを作成して、最初の製品ドキュメントを挿入します。これにより、製品カタログの基盤が確立されます。

まず、MongoDB Shell (mongosh) を開いて、ターミナルからデータベースと対話します。

mongosh

test> のようなプロンプトが表示され、MongoDB サーバーに接続されていることが示されます。次に、product_catalog という名前の新しいデータベースを作成して切り替えます。MongoDB では、データベースは最初にデータが格納されたときに自動的に作成されます。

use product_catalog

switched to db product_catalog という出力は、この新しいデータベース内で作業していることを確認します。

次に、products という名前のコレクションを作成し、そこに単一のドキュメントを挿入します。MongoDB のドキュメントは BSON オブジェクトであり、JSON のように表現されます。insertOne() メソッドを使用します。

db.products.insertOne({
  name: "Wireless Headphones",
  brand: "SoundWave",
  category: "Electronics",
  sku: "SW-HD-001"
});

このコマンドは、namebrandcategorysku の 4 つのフィールドを持つドキュメントを挿入します。出力には、確認応答と MongoDB によってドキュメントに割り当てられた一意の _id が表示されます。

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

ドキュメントが正常に作成されたことを確認するには、find() メソッドを使用して products コレクションからすべてのドキュメントを取得できます。

db.products.find();

出力には、自動生成された _id を含む、先ほど挿入したドキュメントが表示されます。

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001'
  }
]

これで、最初の製品ドキュメントを正常に作成しました。次のステップでも mongosh シェル内で作業を続けます。

価格と在庫情報の埋め込み

MongoDB のドキュメントモデルの主な利点の 1 つは、関連情報を単一のドキュメント内に埋め込むことができることです。このステップでは、既存の製品を更新して、価格と在庫の詳細のためのネストされたオブジェクトを含めます。このアプローチにより、関連するすべての製品データが一緒に保持され、別個のルックアップの必要性を減らすことでクエリパフォーマンスを向上させることができます。

作成したドキュメントを変更するために updateOne() メソッドを使用します。このメソッドは 2 つの引数を取ります。更新するドキュメントを識別するためのフィルターと、変更を指定する更新演算子です。

price オブジェクトと stock オブジェクトを追加します。これらの新しいフィールドを追加するために $set 演算子を使用します。

db.products.updateOne(
  { sku: "SW-HD-001" },
  {
    $set: {
      price: {
        base: 149.99,
        currency: "USD"
      },
      stock: {
        quantity: 250,
        inStock: true
      }
    }
  }
);

このコマンドの内訳を見てみましょう。

  • 最初のオブジェクト { sku: "SW-HD-001" } はフィルターです。これは、sku フィールドが "SW-HD-001" であるドキュメントを見つけるように MongoDB に指示します。
  • 2 番目のオブジェクト { $set: { ... } } は更新操作です。$set は新しいフィールドを追加したり、既存のフィールドを変更したりします。ここでは、price フィールドと stock フィールドを追加しています。これらはそれ自体が埋め込みドキュメントです。

出力は、1 つのドキュメントが一致して変更されたことを確認します。

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

それでは、変更を確認するためにドキュメントを再度取得しましょう。

db.products.find({ sku: "SW-HD-001" });

出力には、新しく埋め込まれた price および stock 情報を持つ製品が表示されます。この構造は、リレーショナルデータベースで価格と在庫のために別々のテーブルを持つよりも、整理されていて直感的です。

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true }
  }
]

製品属性に配列を使用する

製品には、利用可能な色、検索用のタグ、仕様のリストなど、複数の値を持つことができる属性がよくあります。MongoDB は配列を使用してこれをエレガントに処理します。このステップでは、製品ドキュメントにタグの配列を追加します。

再度 updateOne() メソッドと $set 演算子を使用して、tags という新しいフィールドを追加します。このフィールドには文字列の配列が含まれます。

db.products.updateOne(
  { sku: "SW-HD-001" },
  {
    $set: {
      tags: ["audio", "wireless", "over-ear", "noise-canceling"]
    }
  }
);

このコマンドは、sku: "SW-HD-001" を持つ製品を見つけ、それに tags 配列を追加します。出力は、1 つのドキュメントが変更されたことを再度確認します。

結果を確認するために、もう一度ドキュメントをクエリします。

db.products.find({ sku: "SW-HD-001" });

更新されたドキュメントには、tags 配列が含まれるようになりました。これらの値を配列に格納すると、特定のタグを持つ製品を簡単にクエリできます。

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true },
    tags: [ 'audio', 'wireless', 'over-ear', 'noise-canceling' ]
  }
]

配列は、1 対多の関係をモデル化し、関連データのリストをドキュメント内に直接格納するための強力な機能です。

複数製品の追加とクエリ

製品カタログには多くのアイテムが含まれます。このステップでは、複数の製品を一度に追加する方法と、それらをフィルタリングするための基本的なクエリを実行する方法を学びます。

複数のドキュメントをコレクションに同時に追加するには、insertMany() メソッドを使用できます。このメソッドは、ドキュメントの配列を引数として取ります。ここでは、products コレクションに 2 つの新しい製品を追加します。

db.products.insertMany([
  {
    name: "Smartwatch",
    brand: "FitTech",
    category: "Electronics",
    sku: "FT-SW-005",
    price: { base: 199.99, currency: "USD" },
    stock: { quantity: 150, inStock: true },
    tags: ["wearable", "fitness", "smartwatch"]
  },
  {
    name: "Classic T-Shirt",
    brand: "UrbanWear",
    category: "Apparel",
    sku: "UW-TS-001",
    price: { base: 24.99, currency: "USD" },
    stock: { quantity: 500, inStock: true },
    tags: ["clothing", "cotton", "casual"]
  }
]);

出力は操作を認識し、新しく挿入された 2 つのドキュメントの _id 値を一覧表示します。

複数の製品が追加されたので、「Electronics」カテゴリに属する製品のみを見つけるためのクエリを実行しましょう。これは、find() メソッドにフィルターオブジェクトを渡すことで実行できます。

db.products.find({ category: "Electronics" });

このコマンドは products コレクションを検索し、category フィールドの値が "Electronics" であるドキュメントのみを返します。

出力には、カタログ内の 2 つの電子製品、「Wireless Headphones」と「Smartwatch」が表示されます。

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true },
    tags: [ 'audio', 'wireless', 'over-ear', 'noise-canceling' ]
  },
  {
    _id: ObjectId('...'),
    name: 'Smartwatch',
    brand: 'FitTech',
    category: 'Electronics',
    sku: 'FT-SW-005',
    price: { base: 199.99, currency: 'USD' },
    stock: { quantity: 150, inStock: true },
    tags: [ 'wearable', 'fitness', 'smartwatch' ]
  }
]

これで、製品カタログを管理するための基本的な操作を練習しました。MongoDB シェルを終了できます。

exit;

まとめ

この実験では、MongoDB で製品データを構造化するための基本的な原則を学びました。まず、データベースを作成し、基本的な製品ドキュメントを挿入しました。次に、価格や在庫情報などの関連データをネストされたオブジェクトに埋め込むことで、このドキュメントを強化しました。また、製品タグのような複数の値を持つ属性を処理するために配列を使用する方法も学びました。最後に、複数のドキュメントをコレクションに追加し、特定のフィールドに基づいてデータをフィルタリングするための基本的なクエリを実行する練習をしました。これらのスキルは、e コマースアプリケーションや MongoDB を使用するその他のシステムのための、柔軟で効率的なデータモデルを構築するための強固な基盤を提供します。