构建 MongoDB 用户配置文件

MongoDBBeginner
立即练习

介绍

在本实验中,你将学习如何在 MongoDB 中创建和管理用户配置文件。你将从设计一个基础 schema 开始,然后学习如何更新文档、处理用户兴趣的数组,以及管理复杂的嵌套设置。完成本实验后,你将对构建灵活且可扩展的应用程序用户配置文件所需的基础 MongoDB 数据建模概念有扎实的理解。

创建基本用户配置文件

在第一步中,你将创建一个新数据库并插入你的第一个用户配置文件文档。这将建立存储用户信息的基石。

首先,从你的终端打开 MongoDB 交互式 shell。这是与你的 MongoDB 数据库交互的主要工具。

mongosh

进入 shell 后,你将看到一个 test> 提示符。让我们切换到一个名为 userprofiles_db 的新数据库。如果数据库不存在,MongoDB 会在你首次存储数据时为你创建它。

use userprofiles_db

现在,你将向一个名为 profiles 的集合中插入一个文档。在 MongoDB 中,文档是 BSON(类似 JSON 的二进制结构),而集合是相关文档的 agrupación。

执行以下命令插入一个名为 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'
    }
  }
]

添加和更新配置文件信息

在这一步中,你将学习如何修改现有文档。我们将为在上一步中创建的用户配置文件添加更详细的联系信息。

我们将使用 updateOne() 方法来更新 johndoe 的配置文件。此方法接受两个参数:一个用于查找要更新文档的过滤器,以及一个指定更改的更新文档。

让我们添加一个 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_detailsmetadata 中的 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 方法中使用投影(projection)来仅显示 usernameinterests 字段。将字段设置为 1 会包含它,将 _id 设置为 0 会排除它,这能保持输出整洁。

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 });

输出将显示更新后的 settings 对象,其中 sms 现在设置为 true

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

你现在已完成此实验的实际操作步骤。要退出 MongoDB shell,你可以输入 exit 或按 Ctrl+D

exit;

总结

在此实验中,你学习了在 MongoDB 中构建用户配置文件的基础知识。你从创建基本用户文档开始,然后使用 $set 操作符更新其新信息。你还学习了如何使用数组和 $push 操作符管理数据列表,以及如何使用点表示法构建和修改复杂的嵌套配置。这些技能对于为任何管理 MongoDB 中用户数据的应用程序设计灵活且可扩展的模式至关重要。