MongoDB Academy · Урок

Что такое документ BSON?

Вы научитесь читать и записывать документы BSON в оболочке MongoDB, распознавая типы полей: строки, числа, массивы и вложенные объекты.

Урок 1 из 413 шагов

«Что такое документ 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 bytes

String, 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-03

Document 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 — локальная установка не требуется.

Все уроки этого курса

  1. Что такое документ BSON?
  2. Коллекции и таблицы SQL
  3. Базы данных, коллекции и пространства имён
  4. Основы оболочки mongosh
← Назад к MongoDB Academy