Что такое документ BSON?
Вы научитесь читать и записывать документы BSON в оболочке MongoDB, распознавая типы полей: строки, числа, массивы и вложенные объекты.
«Что такое документ BSON?» — бесплатный урок MongoDB Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения MongoDB Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс MongoDB Academy содержит 4 уроков всего.
JSON vs BSON: The Key Difference
Вы записываете данные в MongoDB в привычном формате JSON, но они хранятся как BSON — бинарный JSON. Его быстрее сканировать, и он поддерживает более расширенные типы данных, такие как даты и ObjectId.
The Structure of a BSON Document
BSON-документ — это просто пары «ключ-значение» в фигурных скобках, как в объекте JS. Для каждого документа требуется _id, и MongoDB автоматически создает уникальный идентификатор, если вы его не укажете.
// A minimal MongoDB document
{
_id: ObjectId('64a2f3b1c9e7e12345678901'),
name: 'Alice',
age: 30,
active: true
}
// _id is auto-generated if omitted on insert
// ObjectId encodes the insert timestamp in its first 4 bytesString, Number, and Boolean Fields
Большинство полей выглядят как JSON: строки, числа, true/false и null. Один совет: для денежных сумм используйте Decimal128, чтобы избежать ошибок округления чисел с плавающей запятой. В коде показано, как это сделать.
// Explicit BSON number types in mongosh
db.products.insertOne({
name: 'Widget',
quantity: NumberInt(100), // 32-bit integer
price: NumberDecimal('9.99'), // Exact decimal for money
weight: 0.45 // Double (64-bit float)
});The Date BSON Type
Date — это настоящий тип BSON, а не строка. Это позволяет эффективно сортировать данные по дате и выполнять диапазонные запросы. Никогда не храните даты в виде обычного текста — вы потеряете все эти преимущества.
// Always use BSON Date, not strings
db.events.insertOne({
title: 'Conference',
startDate: new Date('2024-09-01'), // BSON Date
endDate: ISODate('2024-09-03T18:00:00Z')
});
// Range query works perfectly on Date fields:
db.events.find({ startDate: { $gte: new Date('2024-01-01') } });Nested Documents (Sub-Documents)
Значение поля может само по себе быть целым документом — вложенным документом. Адрес органично вписывается в структуру пользователя, и вы можете обращаться к нему с помощью точечной нотации.
// Nested sub-document example
{
_id: ObjectId('...'),
name: 'Bob',
address: {
street: '123 Main St',
city: 'Chicago',
state: 'IL',
zip: '60601'
},
employer: {
name: 'Acme Corp',
since: ISODate('2020-03-01')
}
}
// Query by nested field:
db.users.find({ 'address.city': 'Chicago' });Arrays in BSON Documents
Массивы позволяют хранить в одном поле список — теги, роли или даже вложенные документы. MongoDB может индексировать каждый элемент, поэтому проверка «содержит ли это поле X?» выполняется быстро.
// Document with arrays of primitives and sub-documents
{
_id: ObjectId('...'),
productName: 'Smart TV',
tags: ['electronics', '4K', 'HDR'],
reviews: [
{ user: 'alice', rating: 5, comment: 'Love it!' },
{ user: 'bob', rating: 4, comment: 'Good value.' }
]
}
// Query: documents where tags array contains '4K'
db.products.find({ tags: '4K' });Binary Data and ObjectId
BSON также хранит необработанные бинарные данные и специальный тип ObjectId. Полезная особенность: ObjectId скрывает время своего создания в первых байтах, поэтому поле _id примерно соответствует порядку вставки.
// Extracting timestamp from ObjectId in mongosh
const id = ObjectId('64a2f3b1c9e7e12345678901');
console.log(id.getTimestamp());
// ISODate('2023-07-03T10:15:29.000Z')
// The first 8 hex chars = 4-byte timestamp
// 64a2f3b1 = Unix epoch seconds => 2023-07-03Document Size Limit: 16 MB
Размер каждого документа ограничен 16 МБ — этого более чем достаточно для большинства данных и это подталкивает к правильному моделированию. Для файлов большего размера, таких как видео, используйте GridFS, которая разбивает их на части.
// GridFS upload example (Node.js driver)
const { GridFSBucket } = require('mongodb');
const bucket = new GridFSBucket(db, { bucketName: 'uploads' });
const uploadStream = bucket.openUploadStream('photo.jpg');
fs.createReadStream('/tmp/photo.jpg').pipe(uploadStream);
uploadStream.on('finish', () => console.log('Uploaded:', uploadStream.id));Flexible Schema in Practice
MongoDB не навязывает схему данных, поэтому два документа в одной коллекции могут иметь разные поля. Эта гибкая схема — настоящее преимущество на этапе быстрой начальной разработки.
// Two documents in the same collection with different shapes
// This is perfectly valid in MongoDB
// User with social login
{ _id: ObjectId('...'), name: 'Alice', googleId: 'g_12345', createdAt: new Date() }
// User with email/password
{ _id: ObjectId('...'), name: 'Bob', email: 'bob@test.com', passwordHash: 'bcrypt...', createdAt: new Date() }Reading BSON in mongosh
Оболочка mongosh использует синтаксис, подобный JavaScript. Вы вставляете данные — и они сохраняются в формате BSON; вы делаете запрос — и получаете чистый, читаемый вывод с использованием таких вспомогательных функций, как ObjectId и ISODate.
// mongosh: insert and read back
db.items.insertOne({ name: 'Chair', price: NumberDecimal('199.99'), createdAt: new Date() });
db.items.findOne({ name: 'Chair' });
// Output:
// {
// _id: ObjectId('64a2f3b1...'),
// name: 'Chair',
// price: Decimal128('199.99'),
// createdAt: ISODate('2024-01-15T10:23:00.000Z')
// }BSON Serialization in Node.js
При использовании драйвера Node.js вы просто работаете с обычными объектами JS — он самостоятельно выполняет преобразование в BSON. Вам никогда не придется создавать бинарные данные вручную; числа и даты работают автоматически.
const { ObjectId, Decimal128 } = require('mongodb');
// JS object -> BSON automatically by the driver
const doc = {
_id: new ObjectId(), // BSON ObjectId
name: 'Widget', // BSON String
price: Decimal128.fromString('19.99'), // BSON Decimal128
stock: 100, // BSON Double (JS default)
createdAt: new Date(), // BSON Date
tags: ['sale', 'new'] // BSON Array
};
await db.collection('products').insertOne(doc);Quick Check
Проверьте свое понимание концепций MongoDB и баз данных NoSQL из этого урока.
Lesson Recap
Вы узнали, что BSON расширяет JSON более богатыми типами данных, что документы содержат вложенные поддокументы и массивы, а также что схема данных является гибкой. Далее: коллекции против таблиц SQL.
Изучай JavaScript с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 30
- Уроки
- 120
Часто задаваемые вопросы
Урок «Что такое документ BSON?» бесплатный?
Да — полный текст урока «Что такое документ BSON?» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс MongoDB Academy, подпишись на CoddyKit PRO. Курс MongoDB Academy содержит 4 уроков всего.
Чему я научусь в уроке «Что такое документ BSON?»?
Вы научитесь читать и записывать документы BSON в оболочке MongoDB, распознавая типы полей: строки, числа, массивы и вложенные объекты. Ты практикуешь MongoDB Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать MongoDB Academy?
Предыдущий опыт не требуется. MongoDB Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Что такое документ BSON?»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке MongoDB Academy?
Да. Каждый урок MongoDB Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое документ BSON?
- Коллекции и таблицы SQL
- Базы данных, коллекции и пространства имён
- Основы оболочки mongosh