MongoDB ユーザープロファイルの構築

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

はじめに

この実験では、MongoDB でユーザープロファイルを作成および管理する方法を学びます。まず基本的なスキーマを設計し、次にドキュメントの更新方法、ユーザーの興味のための配列の操作、複雑なネストされた設定の管理方法を学びます。この実験の終わりには、アプリケーションで柔軟かつスケーラブルなユーザープロファイルを作成するための、基本的な MongoDB データモデリングの概念をしっかりと理解できるようになります。

基本的なユーザープロファイルの作成

最初のステップでは、新しいデータベースを作成し、最初のユーザープロファイルドキュメントを挿入します。これにより、ユーザー情報を格納するための基本的な構造が確立されます。

まず、ターミナルから MongoDB のインタラクティブシェルを開きます。これは MongoDB データベースと対話するための主要なツールです。

mongosh

シェルに入ると、test> プロンプトが表示されます。userprofiles_db という名前の新しいデータベースに切り替えましょう。データベースが存在しない場合、MongoDB は最初にデータを保存する際に自動的に作成します。

use userprofiles_db

次に、profiles という名前のコレクションにドキュメントを挿入します。MongoDB のドキュメントは BSON (バイナリ JSON ライク) 構造であり、コレクションは関連するドキュメントのグループです。

johndoe という名前のユーザーのプロファイルを挿入するには、次のコマンドを実行します。

db.profiles.insertOne({
  username: "johndoe",
  personal_info: {
    first_name: "John",
    last_name: "Doe",
    email: "john.doe@example.com"
  },
  metadata: {
    created_at: new Date(),
    account_status: "active"
  }
});

このコマンドは insertOne() メソッドを使用して単一のドキュメントを追加します。ドキュメントには username、ネストされた personal_info オブジェクト、および作成日時とアカウントステータスを追跡するための metadata オブジェクトが含まれています。

ドキュメントが正常に作成されたことを確認するには、find() メソッドを使用して取得できます。

db.profiles.find({ username: "johndoe" });

挿入したばかりのドキュメントと、MongoDB によって自動的に追加された一意の _id フィールドが表示されるはずです。日付と ObjectId は出力によって異なります。

[
  {
    _id: ObjectId('656f1a7b2e3a4c5d6e7f8b9a'),
    username: 'johndoe',
    personal_info: {
      first_name: 'John',
      last_name: 'Doe',
      email: 'john.doe@example.com'
    },
    metadata: {
      created_at: ISODate('2023-12-05T10:30:51.123Z'),
      account_status: 'active'
    }
  }
]

プロファイル情報の追加と更新

このステップでは、既存のドキュメントを変更する方法を学びます。前のステップで作成したユーザープロファイルに、より詳細な連絡先情報を追加します。

johndoe プロファイルを更新するために updateOne() メソッドを使用します。このメソッドは 2 つの引数を取ります。更新するドキュメントを見つけるためのフィルターと、変更を指定する更新ドキュメントです。

contact_details オブジェクトを追加しましょう。フィールドの値を指定された値に置き換える $set 演算子を使用します。フィールドが存在しない場合、$set は新しいフィールドを追加します。

db.profiles.updateOne(
  { username: "johndoe" },
  {
    $set: {
      contact_details: {
        phone: "+1-555-1234",
        address: {
          street: "123 Main St",
          city: "San Francisco",
          country: "USA"
        }
      },
      "metadata.last_updated": new Date()
    }
  }
);

このコマンドでは、新しい contact_details オブジェクトを追加しました。また、ドット表記 ("metadata.last_updated") を使用して、既存の metadata オブジェクトを上書きせずに last_updated フィールドを追加しました。これは、ネストされたフィールドを更新するための強力な機能です。

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

db.profiles.find({ username: "johndoe" });

出力には、新しく追加された contact_details と、metadata 内の last_updated タイムスタンプが表示されるようになります。

[
  {
    _id: ObjectId('656f1a7b2e3a4c5d6e7f8b9a'),
    username: 'johndoe',
    personal_info: {
      first_name: 'John',
      last_name: 'Doe',
      email: 'john.doe@example.com'
    },
    metadata: {
      created_at: ISODate('2023-12-05T10:30:51.123Z'),
      account_status: 'active',
      last_updated: ISODate('2023-12-05T10:35:22.456Z')
    },
    contact_details: {
      phone: '+1-555-1234',
      address: {
        street: '123 Main St',
        city: 'San Francisco',
        country: 'USA'
      }
    }
  }
]

プロファイルでの配列操作

ユーザープロファイルには、興味、スキル、タグなどの項目のリストが含まれることがよくあります。MongoDB は配列を使用してこれを効率的に処理します。このステップでは、ユーザープロファイルに興味の配列を追加および変更します。

まず、$set 演算子を使用して、johndoe プロファイルに interests 配列を追加しましょう。

db.profiles.updateOne(
  { username: "johndoe" },
  { $set: { interests: ["technology", "travel"] } }
);

次に、ユーザーが新しい興味を持つようになったと仮定します。配列全体を置き換える代わりに、$push 演算子を使用して新しい要素を追加できます。この演算子は、指定された値を配列に追加し、追加に対してより効率的です。

db.profiles.updateOne(
  { username: "johndoe" },
  { $push: { interests: "photography" } }
);

更新されたプロファイルを表示して、新しい興味を確認しましょう。find メソッドでプロジェクションを使用して、usernameinterests フィールドのみを表示できます。フィールドを 1 に設定すると含まれ、_id0 に設定すると除外されるため、出力をきれいに保つことができます。

db.profiles.find(
  { username: "johndoe" },
  { username: 1, interests: 1, _id: 0 }
);

出力には、新しく追加された要素を含む interests 配列が表示されます。

[
  {
    "username": "johndoe",
    "interests": ["technology", "travel", "photography"]
  }
]

配列の要素に基づいてユーザーをクエリすることもできます。たとえば、「technology」に興味のあるすべてのユーザーを見つけるには、次のようにします。

db.profiles.find({ interests: "technology" });

複雑なネストされたデータの管理

実際のアプリケーションでは、ユーザー設定などの複雑な構成を保存する必要があることがよくあります。MongoDB のネストされたドキュメントのサポートは、この目的に最適です。このステップでは、プロファイルに詳細な settings オブジェクトを追加および更新します。

まず、themelanguagenotifications のネストされたフィールドを持つ settings オブジェクトを追加しましょう。

db.profiles.updateOne(
  { username: "johndoe" },
  {
    $set: {
      settings: {
        theme: "dark",
        language: "en",
        notifications: {
          email: true,
          sms: false
        }
      }
    }
  }
);

次に、settings オブジェクト全体を書き直すことなく、単一のネストされたフィールドを更新しましょう。これは、ドット表記を使用して再度行うことができます。ユーザーの SMS 通知を有効にしましょう。

db.profiles.updateOne(
  { username: "johndoe" },
  { $set: { "settings.notifications.sms": true } }
);

このコマンドは、ネストされた notifications オブジェクト内の sms フィールドを正確にターゲットにし、その値を true に変更し、settings オブジェクトの残りはそのままにします。

変更を確認するために、プロジェクションを使用してユーザーの settings オブジェクトのみを取得しましょう。

db.profiles.find({ username: "johndoe" }, { settings: 1, _id: 0 });

出力には、smstrue に設定された更新済みの settings オブジェクトが表示されます。

[
  {
    "settings": {
      "theme": "dark",
      "language": "en",
      "notifications": { "email": true, "sms": true }
    }
  }
]

これで、この実験の実際の手順は完了です。MongoDB シェルを終了するには、「exit」と入力するか、「Ctrl+D」を押します。

exit;

まとめ

この実験では、MongoDB でユーザープロファイルを作成するための基本を学びました。まず基本的なユーザー ドキュメントを作成し、次に $set 演算子を使用して新しい情報で更新しました。また、配列と $push 演算子を使用してデータのリストを管理する方法、およびドット表記を使用して複雑な構成を構造化および変更する方法を学びました。これらのスキルは、MongoDB でユーザーデータを管理するあらゆるアプリケーションの柔軟でスケーラブルなスキーマを設計するために不可欠です。