BSON Types
https://www.mongodb.com/docs/manual/reference/bson-types/
BSON — це двійковий формат серіалізації, який використовується для зберігання документів і здійснення віддалених викликів процедур у MongoDB. Специфікацію BSON можна знайти на bsonspec.org
Кожен тип BSON має цілочисельні та рядкові ідентифікатори, перелічені в наступній таблиці:
Type | Number | Alias | Notes |
---|---|---|---|
Double | 1 | “double” | |
String | 2 | “string” | |
Object | 3 | “object” | |
Array | 4 | “array” | |
Binary data | 5 | “binData” | |
Undefined | 6 | “undefined” | Deprecated. |
ObjectId | 7 | “objectId” | |
Boolean | 8 | “bool” | |
Date | 9 | “date” | |
Null | 10 | “null” | |
Regular Expression | 11 | “regex” | |
DBPointer | 12 | “dbPointer” | Deprecated. |
JavaScript | 13 | “javascript” | |
Symbol | 14 | “symbol” | Deprecated. |
JavaScript code with scope | 15 | “javascriptWithScope” | Deprecated in MongoDB 4.4. |
32-bit integer | 16 | “int” | |
Timestamp | 17 | “timestamp” | |
64-bit integer | 18 | “long” | |
Decimal128 | 19 | “decimal” | |
Min key | -1 | “minKey” | |
Max key | 127 | “maxKey” |
- Оператор
$type
підтримує використання цих значень для запиту полів за допомогою їх тип BSON.$type
також підтримує псевдонімnumber
, який відповідає цілі, десяткові, подвійні та довгі типи BSON. - Оператор агрегації
$type
повертає тип BSON свого аргументу . - Оператор агрегації
$isNumber
повертає значенняtrue
, якщо його аргумент є BSON цілим, десятковим, подвійним або довгим. Нове у версії 4.4
Щоб визначити тип поля, перегляньте Перевірка типу.
Якщо ви конвертуєте BSON у JSON, перегляньте довідку Розширений JSON.
У наступних розділах описано особливі міркування щодо окремих типів BSON.
Двійкові дані
Двійкове значення binData
BSON є масивом байтів. Значення binData
має підтип, який вказує, як інтерпретувати двійкові дані. У наступній таблиці показано підтипи.
Number | Subtype |
---|---|
0 | Generic binary subtype |
1 | Function data |
2 | Binary (old) |
3 | UUID (old) |
4 | UUID |
5 | MD5 |
6 | Encrypted BSON value |
7 | Compressed time series dataNew in version 5.2. |
128 | Custom data |
ObjectId
ObjectId невеликі, ймовірно унікальні, швидко генеруються та впорядковані. Значення ObjectId мають довжину 12 байтів і складаються з:
- 4-байтова позначка часу, що представляє створення ObjectId, виміряна в секундах з епохи Unix.
- 5-байтове випадкове значення, яке генерується один раз на процес. Це випадкове значення є унікальним для машини та процесу.
- 3-байтовий інкрементний лічильник, ініціалізований до випадкового значення.
Для позначок часу та значень лічильника старші байти з’являються першими в послідовності байтів (старший байт). Це відрізняється від інших значень BSON, де молодші байти з’являються першими (little-endian).
Якщо для створення ObjectId використовується ціле число, ціле число замінює мітку timestamp.
У MongoDB для кожного документа, що зберігається в колекції, потрібне унікальне поле _id, яке діє як первинний ключ. Якщо у вставленому документі немає поля _id
, драйвер MongoDB автоматично генерує ObjectId для поле _id
.
Це також стосується документів, вставлених через операції оновлення з upsert: true.
Клієнти MongoDB повинні додати поле _id
з унікальним ObjectId. Використання ObjectIds для поля _id
забезпечує такі додаткові переваги:
-
у
mongosh
, ви можете отримати доступ до часу створенняObjectId
, використовуючиObjectId.getTimestamp()
. -
сортування за полем
_id
, яке зберігає значенняObjectId
, приблизно еквівалентно сортуванню за часом створення.
Хоча значення ObjectId мають збільшуватися з часом, вони не обов’язково є монотонними. Це тому, що вони:
- Містить лише одну секунду тимчасової роздільності, тому значення ObjectId, створені протягом однієї секунди, не мають гарантоване замовлення, і
- Створюються клієнтами, які можуть мати різні системні годинники.
Використовуйте методи ObjectId()
, щоб установити та отримати значення ObjectId.
Починаючи з MongoDB 5.0, mongosh
замінює застарілу оболонку mongo
. Методи ObjectId()
працюють інакше в mongosh
, ніж у застарілій оболонці mongo
. Щоб отримати додаткові відомості про застарілі методи, перегляньте Legacy mongo Shell.
String
Рядки BSON є UTF-8. Загалом драйвери для кожної мови програмування перетворюють рядковий формат мови на UTF-8 під час серіалізації та десеріалізації BSON. Це дає змогу легко зберігати більшість міжнародних символів у рядках BSON. Дані рядки з використанням наборів символів UTF-8, використовуючи sort()
на рядки будуть досить правильними. Однак, оскільки внутрішньо sort()
використовує C++ strcmp
API , порядок сортування може неправильно обробляти деякі символи. Крім того, запити MongoDB $regex
підтримують UTF-8 у рядок регулярного виразу.
Timestamps
BSON має спеціальний тип позначки часу timestamp для внутрішнього використання MongoDB і не пов’язаний зі звичайною датою типу. Цей тип внутрішньої позначки часу є 64-бітним значенням, де:
- старші 32 біти є значенням
time_t
(секунди з епохи Unix) - молодші 32 біти є порядковим числом, що збільшується, для операцій протягом певної секунди.
У той час як формат BSON є порядковим порядком байтів, і тому спочатку зберігає молодші біти, mongod
завжди порівнює значення time_t
перед значенням ordinal
на всіх платформах, незалежно від порядку байтів.
У межах одного екземпляра mongod
значення позначок часу завжди унікальні.
Під час реплікації oplog має поле ts
. Значення в цьому полі відображають час операції, для якого використовується значення позначки часу BSON.
Тип позначки часу BSON призначений для внутрішнього використання MongoDB. У більшості випадків у розробці додатків ви захочете використовувати тип дати BSON. Див. Дата для отримання додаткової інформації.
Під час вставлення документа, який містить поля верхнього рівня з порожніми значеннями міток часу, MongoDB замінює порожні значення міток часу поточним значенням мітки часу, за наступним винятком. Якщо саме поле _id
містить порожнє значення позначки часу, воно завжди вставлятиметься як є й не замінюватиметься.
Вставте документ із порожнім значенням мітки часу:
db.test.insertOne( { ts: new Timestamp() } );
Запуск db.test.find()
тоді повернути документ, подібний до такого:
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
Сервер замінив порожнє значення мітки часу для ts
на значення мітки часу під час вставки.
Date
BSON Date is a 64-bit integer that represents the number of milliseconds since the Unix epoch (Jan 1, 1970). This results in a representable date range of about 290 million years into the past and future.
The official BSON specification refers to the BSON Date type as the UTC datetime.
BSON Date type is signed. [2] Negative values represent dates before 1970.
Construct a Date using the new Date()
constructor in mongosh
:
var mydate1 = new Date()
Construct a Date using the ISODate()
constructor in mongosh
:
var mydate2 = ISODate()
Return the Date value as string:
mydate1.toString()
Return the month portion of the Date value; months are zero-indexed, so that January is month 0
:
mydate1.getMonth()
Prior to version 2.0, Date
values were incorrectly interpreted as unsigned integers, which affected sorts, range queries, and indexes on Date
fields. Because indexes are not recreated when upgrading, please re-index if you created an index on Date
values with an earlier version, and dates before 1970 are relevant to your application.