介绍
在本实验中,你将学习如何使用 MongoDB 中的各种基本数据类型。本实验涵盖了使用数字、字符串、布尔值、日期和 ObjectId 存储、查询和操作数据的实际示例。你将获得执行常见数据库操作的实践经验,并理解每种数据类型的适用场景。完成本实验后,你将为在 MongoDB 中有效建模数据打下坚实的基础。
在本实验中,你将学习如何使用 MongoDB 中的各种基本数据类型。本实验涵盖了使用数字、字符串、布尔值、日期和 ObjectId 存储、查询和操作数据的实际示例。你将获得执行常见数据库操作的实践经验,并理解每种数据类型的适用场景。完成本实验后,你将为在 MongoDB 中有效建模数据打下坚实的基础。
在本实验的第一步中,你将学习使用最常见的数据类型:数字和字符串。你将启动 MongoDB shell,创建一个数据库和集合,然后插入和查询包含这些类型的文档。
首先,打开你的终端并启动 MongoDB shell。这个交互式环境允许你直接对数据库执行命令。
mongosh
进入 shell 后,你将看到一个 > 提示符。让我们创建一个名为 inventory 的新数据库并切换到它。在 MongoDB 中,当你首次向数据库存储数据时,它会自动创建。
use inventory
现在,创建一个名为 products 的集合并插入一个文档。这个文档将包含一个字符串字段 (name) 和两个数字字段 (price 和 stock)。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 类型用于表示一个没有值的字段。
让我们继续在 mongosh shell 中使用 inventory 数据库。插入一个带有布尔字段 inStock 和 onSale,以及一个设置为 null 的 discontinuedDate 字段的新产品。
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 字段更新为当前时间戳。
在本实验的最后一步,你将学习两种重要的结构类型:ObjectId 和 Array。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 数据库以满足各种应用需求奠定了坚实的基础。