构建 MongoDB 产品数据结构

MongoDBBeginner
立即练习

介绍

在本实验中,你将学习如何使用 MongoDB 为产品数据设计结构化文档模式。对于电子商务应用而言,精心设计的模式对于性能和可扩展性至关重要。你将从创建一个简单的产品文档开始,通过嵌入定价和库存信息等相关数据,以及使用数组处理多值属性来逐步增强它。在本实验结束时,你将对如何在 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。输出将显示一个确认信息以及 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 shell 中进行操作。

嵌入价格和库存信息

MongoDB 文档模型的一个关键优势在于能够将相关信息嵌入到单个文档中。在这一步,你将更新现有产品,以包含用于价格和库存详情的嵌套对象。这种方法将所有相关产品数据集中在一起,通过减少对单独查找的需求来提高查询性能。

我们将使用 updateOne() 方法来修改我们创建的文档。此方法接受两个参数:一个用于识别要更新文档的过滤器,以及一个指定更改的更新操作符。

让我们添加一个 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" } 是过滤器。它告诉 MongoDB 查找 sku 字段为 "SW-HD-001" 的文档。
  • 第二个对象 { $set: { ... } } 是更新操作。$set 用于添加新字段或修改现有字段。在这里,我们正在添加 pricestock 字段,它们本身就是嵌入式文档。

输出将确认已匹配并修改了一个文档。

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

现在,让我们再次检索该文档以查看更改。

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

输出现在显示了产品及其新嵌入的 pricestock 信息。与关系数据库中为价格和库存设置单独的表相比,这种结构更加有条理且直观。

[
  {
    _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 通过数组优雅地处理了这一点。在这一步,你将向产品文档添加一个标签数组。

我们将再次使用带有 $set 操作符的 updateOne() 方法来添加一个名为 tags 的新字段。此字段将包含一个字符串数组。

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

此命令查找 sku: "SW-HD-001" 的产品,并向其添加一个 tags 数组。输出将再次确认一个文档已被修改。

要查看结果,请再次查询该文档。

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' ]
  }
]

数组是用于建模一对多关系以及直接在文档中存储相关数据列表的强大功能。

添加和查询多个产品

产品目录将包含许多商品。在这一步,你将学习如何一次性添加多个产品,然后执行一个基本查询来过滤它们。

要同时向集合添加多个文档,你可以使用 insertMany() 方法。此方法接受一个文档数组作为其参数。让我们向我们的 products 集合添加两个新产品。

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

输出将确认操作,并列出两个新插入文档的 _id 值。

现在我们有了多个产品,让我们执行一个查询来仅查找属于“Electronics”类别的产品。你可以通过将过滤器对象传递给 find() 方法来完成此操作。

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

此命令搜索 products 集合,并仅返回 category 字段值为“Electronics”的文档。

输出将显示我们目录中的两个电子产品:“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 shell。

exit;

总结

在本实验中,你学习了在 MongoDB 中构建产品数据的基本原则。你首先创建了一个数据库并插入了一个基本的产品文档。然后,你通过嵌入相关数据(如价格和库存信息)到嵌套对象中来增强该文档。你还学习了如何使用数组来处理具有多个值的属性,例如产品标签。最后,你练习了向集合添加多个文档以及执行基本查询以根据特定字段过滤数据。这些技能为使用 MongoDB 构建灵活高效的电子商务应用程序和其他系统的数据模型奠定了坚实的基础。