0Pricing
MongoDB Academy · 课时

什么是 BSON 文档

您将在 MongoDB shell 中读写 BSON 文档,并识别字符串、数字、数组和嵌套对象等字段类型。

什么是 BSON 文档 是 CoddyKit 上的免费 MongoDB Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 MongoDB Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 MongoDB Academy 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

JSON vs BSON: The Key Difference

You write MongoDB data as familiar JSON, but it's stored as BSON — binary JSON. It's faster to scan and supports richer types like dates and ObjectId.

The Structure of a BSON Document

A BSON document is just key-value pairs in curly braces, like a JS object. Every document needs an _id, and MongoDB auto-creates a unique one if you skip it.

// 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

Most fields look like JSON: strings, numbers, true/false, and null. One tip — for money, use Decimal128 to avoid floating-point rounding errors. The code shows how.

// 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 is a real BSON type, not a string. That lets you sort and range-query by date efficiently. Never store dates as plain text — you'd lose all of that.

// 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)

A field's value can be a whole document of its own — a nested document. An address fits naturally inside a user, and you query it with dot notation.

// 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

Arrays let one field hold a list — tags, roles, or even sub-documents. MongoDB can index each element, so checking "does this contain X?" stays fast.

// 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 also stores raw Binary data and the special ObjectId. Neat trick: an ObjectId hides its creation time in its first bytes, so _id roughly sorts by insert order.

// 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

Each document maxes out at 16 MB — huge for most data, and a nudge toward good modeling. For bigger files like videos, use GridFS, which splits them into chunks.

// 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 doesn't force a schema, so two documents in one collection can have different fields. This flexible schema is a gift during fast, early development.

// 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

The mongosh shell speaks a JavaScript-like syntax. Insert and it saves BSON; query and it prints clean, readable output with helpers like ObjectId and 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

With the Node.js driver you just use plain JS objects — it handles BSON conversion for you. You never build binary by hand; numbers and dates just work.

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

Test your understanding of MongoDB & NoSQL Databases concepts from this lesson.

Lesson Recap

You learned BSON extends JSON with richer types, that documents nest sub-documents and arrays, and that the schema is flexible. Next: collections vs SQL tables.

常见问题解答

「什么是 BSON 文档」课时是免费的吗?

是的 — 「什么是 BSON 文档」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 MongoDB Academy 课程的其余内容,请升级到 CoddyKit PRO。 MongoDB Academy 课程共包含 4 节课。

「什么是 BSON 文档」这节课中我会学到什么?

您将在 MongoDB shell 中读写 BSON 文档,并识别字符串、数字、数组和嵌套对象等字段类型。 你通过在浏览器中直接运行的动手代码来练习 MongoDB Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 MongoDB Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 MongoDB Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「什么是 BSON 文档」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 MongoDB Academy 课中编写并运行代码吗?

能。每节 MongoDB Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是 BSON 文档
  2. 集合与 SQL 表的比较
  3. 数据库、集合与命名空间
  4. mongosh Shell 基础
← 返回 MongoDB Academy