使用 MongoDB 基本数据类型

MongoDBBeginner
立即练习

介绍

在本实验中,你将学习如何使用 MongoDB 中的各种基本数据类型。本实验涵盖了使用数字、字符串、布尔值、日期和 ObjectId 存储、查询和操作数据的实际示例。你将获得执行常见数据库操作的实践经验,并理解每种数据类型的适用场景。完成本实验后,你将为在 MongoDB 中有效建模数据打下坚实的基础。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 83% 的好评率。

使用数字和字符串

在本实验的第一步中,你将学习使用最常见的数据类型:数字和字符串。你将启动 MongoDB shell,创建一个数据库和集合,然后插入和查询包含这些类型的文档。

首先,打开你的终端并启动 MongoDB shell。这个交互式环境允许你直接对数据库执行命令。

mongosh

进入 shell 后,你将看到一个 > 提示符。让我们创建一个名为 inventory 的新数据库并切换到它。在 MongoDB 中,当你首次向数据库存储数据时,它会自动创建。

use inventory

现在,创建一个名为 products 的集合并插入一个文档。这个文档将包含一个字符串字段 (name) 和两个数字字段 (pricestock)。MongoDB 使用 BSON (Binary JSON) 类型,其中数字可以是整数或浮点数(双精度)。

db.products.insertOne({
    name: "Laptop",
    price: 1200.50,
    stock: 50
})

你应该会看到一条确认消息,其中包含新插入文档的 ObjectId

示例输出:

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

文档插入后,让我们查询该集合。首先,使用 $gt (大于) 操作符查找价格大于 1000 的产品。

db.products.find({ price: { $gt: 1000 } })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Laptop',
    price: 1200.5,
    stock: 50
  }
]

接下来,执行一个查询,根据其精确名称(一个字符串值)查找产品。这是检索特定项目的常用方法。

db.products.find({ name: "Laptop" })

此命令将返回相同的文档,演示了如何基于字符串字段进行查询。

使用布尔值和 Null 值

在此步骤中,你将探索布尔值和 Null 数据类型。布尔值非常适合表示真或假状态的字段,例如标志。Null 类型用于表示一个没有值的字段。

让我们继续在 mongosh shell 中使用 inventory 数据库。插入一个带有布尔字段 inStockonSale,以及一个设置为 nulldiscontinuedDate 字段的新产品。

db.products.insertOne({
    name: "Wireless Mouse",
    price: 25,
    inStock: true,
    onSale: false,
    discontinuedDate: null
})

示例输出:

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

现在你拥有了一个包含布尔值和 Null 值的文档。你可以像查询其他任何数据类型一样查询它们。让我们通过查询布尔值 true 来查找所有当前有货的产品。

db.products.find({ inStock: true })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Wireless Mouse',
    price: 25,
    inStock: true,
    onSale: false,
    discontinuedDate: null
  }
]

此命令检索 inStock 字段精确等于 true 的文档。接下来,让我们通过查找 discontinuedDate 字段中的 Null 值来查找尚未停产的产品。请注意,在 MongoDB 中,查询 Null 值会同时匹配字段被显式设置为 Null 的文档以及字段根本不存在的文档。

db.products.find({ discontinuedDate: null })

此查询将返回多个文档:“Wireless Mouse”(其 discontinuedDate 为 Null)以及任何其他根本没有 discontinuedDate 字段的产品(例如“Laptop”)。如果你只想查找字段被显式设置为 Null 的文档,你需要使用不同的查询模式。

存储日期和时间戳

本实验重点介绍 Date 数据类型,它对于存储基于时间的信​​息至关重要,例如创建日期、更新或事件。MongoDB 将日期存储为 64 位整数,表示自 Unix 纪元(1970 年 1 月 1 日 UTC)以来的毫秒数。

让我们插入一个包含日期字段的文档。你可以使用 new Date() 创建一个表示当前时间的日期对象,或者通过传递 ISO-8601 日期字符串来创建一个表示特定时间的日期对象。

db.products.insertOne({
    name: "Smartwatch",
    price: 250,
    purchaseDate: new Date("2023-10-26T10:00:00Z"),
    lastUpdated: new Date()
})

示例输出:

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

现在,让我们根据日期字段查询产品。例如,查找在 2023 年初或之后购买的所有产品。你可以将 $gte (大于或等于) 操作符与 Date 对象一起使用。

db.products.find({
    purchaseDate: { $gte: new Date("2023-01-01") }
})

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Smartwatch',
    price: 250,
    purchaseDate: ISODate('2023-10-26T10:00:00.000Z'),
    lastUpdated: ISODate('...')
  }
]

MongoDB 还为日期提供了更新操作符。$currentDate 操作符可用于将字段设置为当前服务器日期。让我们更新你之前创建的“Laptop”文档的 lastUpdated 字段,以跟踪其最后修改时间。

db.products.updateOne(
    { name: "Laptop" },
    { $currentDate: { lastUpdated: true } }
)

示例输出:

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

此操作会查找名称为“Laptop”的文档,并将其 lastUpdated 字段更新为当前时间戳。

理解 ObjectIds 和数组

在本实验的最后一步,你将学习两种重要的结构类型:ObjectIdArray。MongoDB 中的每个文档都有一个唯一的 _id 字段,如果未提供,则默认为 ObjectId。数组允许你在单个字段中存储值的列表。

首先,让我们插入一个名为 tags 的数组字段的文档。这对于存储多个类别或属性非常有用。

db.products.insertOne({
    name: "Mechanical Keyboard",
    price: 75,
    tags: ["gaming", "mechanical", "RGB"]
})

示例输出:

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

insertedId 是此新文档的 ObjectId。它是一个 12 字节的值,可确保唯一性。你可以通过 _id 查询文档。首先,找到文档并将 _id 存储在一个变量中。

const keyboard = db.products.findOne({ name: "Mechanical Keyboard" })
const keyboardId = keyboard._id

现在,使用此 keyboardId 变量再次获取文档。这是检索单个特定文档最高效的方法。

db.products.findOne({ _id: keyboardId })

接下来,让我们处理 tags 数组。你可以查询数组包含特定元素的文档。例如,要查找所有标记为“gaming”的产品:

db.products.find({ tags: "gaming" })

示例输出:

[
  {
    _id: ObjectId("..."),
    name: 'Mechanical Keyboard',
    price: 75,
    tags: [ 'gaming', 'mechanical', 'RGB' ]
  }
]

此命令高效地查找 tags 数组中包含字符串“gaming”的所有文档。数组是为单个文档内的关系建模的强大功能。要退出 MongoDB shell,请键入 exit 或按 Ctrl+D

exit

总结

在本实验中,你学习了如何使用 MongoDB 中最基本的数据类型。你首先使用数字和字符串来存储和查询产品信息。然后,你探索了布尔值和 null 值,用于表示状态标志和缺失数据。你还学会了使用 Date 类型及其相关操作符来处理时间数据。最后,你了解了 ObjectId 作为唯一标识符以及 Array 类型用于存储值列表。这些知识为你设计和交互 MongoDB 数据库以满足各种应用需求奠定了坚实的基础。