Введение
В этой лабораторной работе вы научитесь работать с различными фундаментальными типами данных в MongoDB. Лабораторная работа охватывает практические примеры того, как хранить, запрашивать и манипулировать данными, используя числа, строки, булевы значения, даты и ObjectId. Вы получите практический опыт выполнения распространенных операций с базами данных и поймете соответствующие сценарии использования для каждого типа данных. К концу этой лабораторной работы у вас будет прочная основа для эффективного моделирования данных в MongoDB.
Работа с числами и строками
На этом первом этапе вы научитесь использовать наиболее распространенные типы данных: числа и строки. Вы запустите оболочку MongoDB, создадите базу данных и коллекцию, а затем вставите и запросите документы, содержащие эти типы.
Сначала откройте терминал и запустите оболочку MongoDB. Эта интерактивная среда позволяет выполнять команды непосредственно против вашей базы данных.
mongosh
Оказавшись внутри оболочки, вы увидите приглашение >. Давайте создадим и переключимся на новую базу данных с именем 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("...")
}
Теперь, когда документ вставлен, давайте выполним запрос к коллекции. Сначала найдите продукты с ценой выше 1000, используя оператор $gt (больше чем).
db.products.find({ price: { $gt: 1000 } })
Пример вывода:
[
{
_id: ObjectId("..."),
name: 'Laptop',
price: 1200.5,
stock: 50
}
]
Далее выполните запрос для поиска продукта по его точному имени, которое является строковым значением. Это распространенный способ получения конкретных элементов.
db.products.find({ name: "Laptop" })
Эта команда вернет тот же документ, демонстрируя, как выполнять запросы на основе строковых полей.
Использование булевых значений и значений null
В этом шаге вы изучите булевы типы данных и типы данных null. Булевы значения идеально подходят для полей, представляющих состояние "истина" или "ложь", например, флаги. Тип null используется для представления поля без значения.
Продолжим использовать базу данных inventory в оболочке mongosh. Вставьте новый продукт с булевыми полями inStock и onSale, а также полем discontinuedDate, установленным в null.
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. Далее найдем продукты, которые не были сняты с производства, ища значение null в поле discontinuedDate. Обратите внимание, что в MongoDB запрос для null соответствует как документам, где поле явно установлено в null, так и документам, где поле вообще отсутствует.
db.products.find({ discontinuedDate: null })
Этот запрос вернет несколько документов: "Wireless Mouse" (у которого discontinuedDate: null) и любые другие продукты, у которых вообще нет поля discontinuedDate (например, "Laptop"). Если вы хотите найти только документы, в которых поле явно установлено в null, вам потребуется использовать другой шаблон запроса.
Хранение дат и временных меток
Этот шаг посвящен типу данных Date, который необходим для хранения информации, связанной со временем, такой как даты создания, обновления или события. MongoDB хранит даты как 64-битные целые числа, представляющие миллисекунды с начала эпохи Unix (1 января 1970 г., 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 полезен для установки поля на текущую дату сервера. Давайте обновим поле lastUpdated для документа "Laptop", который вы создали ранее, чтобы отслеживать, когда он был последний раз изменен.
db.products.updateOne(
{ name: "Laptop" },
{ $currentDate: { lastUpdated: true } }
)
Пример вывода:
{
"acknowledged": true,
"insertedId": null,
"matchedCount": 1,
"modifiedCount": 1,
"upsertedCount": 0
}
Эта операция находит документ с именем "Laptop" и обновляет его поле lastUpdated до текущей временной метки.
Понимание ObjectId и массивов
На этом заключительном этапе вы узнаете о двух важных структурных типах: 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, введите exit или нажмите Ctrl+D.
exit
Резюме
В этой лабораторной работе вы научились работать с наиболее важными типами данных в MongoDB. Вы начали с использования чисел и строк для хранения и запроса информации о продуктах. Затем вы изучили булевы значения и значение null для представления флагов состояния и отсутствующих данных. Вы также научились работать с временными данными, используя тип Date и связанные с ним операторы. Наконец, вы получили представление об ObjectId как уникальном идентификаторе и типе Array для хранения списков значений. Эти знания обеспечивают прочную основу для проектирования и взаимодействия с базами данных MongoDB для широкого спектра приложений.

