文檔數據格式:BSON
概覽
在本指南中,您可以了解 BSON 數據格式、MongoDB 如何使用它以及如何獨立於 MongoDB Java 驅動程序安裝 BSON 庫。
BSON 數據格式
BSON或二進制 JSON 是 MongoDB 用於組織和存儲數據的數據格式。此數據格式包括所有 JSON 數據結構類型,並增加了對日期、不同大小整數、ObjectId 和二進制數據等類型的支持。有關受支持類型的完整列表,請參閱 BSON 類型服務器手冊頁。
二進制格式不是人類可讀的,但您可以使用 Java BSON 庫將其轉換為 JSON 表示。您可以在我們關於JSON 和 BSON 的文章中閱讀有關這些格式之間關系的更多信息。
MongoDB 和 BSON
使用 BSON 庫的 MongoDB Java 驅動程序允許您使用實現BSON 接口的對象類型之一來處理 BSON 數據 ,包括:
- 文檔(BSON 庫包)
- BsonDocument(BSON 庫包)
- RawBsonDocument(BSON 庫包)
- JsonObject(BSON 庫包)
- BasicDBObject(Java 驅動程序包)
有關使用這些對象類型的更多信息,請參閱我們的 文檔指南。
安裝 BSON 庫
這些說明向您展示了如何將 BSON 庫作為依賴項添加到您的項目中。如果您將 MongoDB Java 驅動程序作為依賴項添加到您的項目中,則可以跳過此步驟,因為 BSON 庫已作為驅動程序的必需依賴項包含在內。有關如何將 MongoDB Java 驅動程序作為依賴項添加到您的項目的說明,請參閱我們的快速入門指南的 驅動程序安裝部分。
我們建議您使用Maven或 Gradle構建自動化工具來管理項目的依賴項。從以下選項卡中選擇以查看該工具的依賴項聲明:
以下代碼段顯示了文件dependencies
部分中的依賴項聲明 pom.xml
。
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>bson</artifactId> <version>4.3.2</version> </dependency> </dependencies>
以下代碼段顯示了文件中dependencies
對象中的依賴項聲明 build.gradle
。
dependencies { compile 'org.mongodb:bson:4.3.2' }
如果您沒有使用上述工具之一,您可以通過直接從sonatype 存儲庫下載 JAR 文件將其包含在您的項目中 。
文檔數據格式:擴展 JSON
概覽
在本指南中,您可以了解如何在 MongoDB Java 驅動程序中使用擴展 JSON 格式。
JSON 是一種數據格式,表示對象、數組、數字、字符串、布爾值和空值的值。的擴展JSON格式定義一個保留的密鑰集合與前綴“ $
”來表示字段類型信息直接對應於每種類型在BSON,所述格式MongoDB使用來存儲數據。
本指南解釋了以下主題:
- 不同的 MongoDB 擴展 JSON 格式
- 如何使用 BSON 庫在擴展 JSON 和 Java 對象之間進行轉換
- 如何創建 BSON 類型的自定義轉換
有關這些格式之間差異的更多信息,請參閱我們 關於 JSON 和 BSON 的文章。
擴展 JSON 格式
MongoDB 擴展 JSON 具有不同的字符串格式來表示 BSON 數據。每種不同的格式都符合 JSON RFC 並滿足特定用例。在擴展格式中,也被稱為 規范格式,特征在於用於而不丟失信息每BSON類型的雙向轉換特定表示。的寬松模式 格式是更簡潔,更接近普通JSON,但並不代表所有類型的信息,例如數量字段的特定的字節大小。
請參閱下表以查看每種格式的說明:
Name
|
描述
|
---|---|
Extended
|
也稱為
規范
格式,這種 JSON 表示避免了 BSON 類型信息的丟失。
這種格式在失去人類可讀性和與舊格式的互操作性的情況下優先保留類型。
|
Relaxed Mode
|
描述具有某些類型信息丟失的 BSON 文檔的 JSON 表示。
這種格式在丟失某些類型信息的情況下優先考慮人類可讀性和互操作性。
|
Shell
|
與 MongoDB shell 中使用的語法匹配的 JSON 表示。
這種格式優先考慮與 MongoDB shell 的兼容性,它經常使用 JavaScript 函數來表示類型。
|
驅動程序將$uuid
擴展 JSON 類型從字符串解析BsonBinary
為二進制子類型 4的 對象。有關$uuid
字段解析的更多信息,請參閱 擴展 JSON 規范中解析 $uuid 字段的 特殊規則部分。
有關這些格式的更多詳細信息,請參閱以下資源:
- JSON RFC官方文檔
- MongoDB 擴展 JSON服務器手冊入口
- mongo shell服務器手冊入口中的數據類型
- BsonBinary API 文檔
- 擴展 JSON 規范GitHub 文檔
擴展 JSON 示例
以下示例顯示了一個包含以每個擴展 JSON 格式表示的 ObjectId、日期和長數字字段的文檔。單擊與您要查看的示例的格式對應的選項卡:
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "numViews": { "$numberLong": "36520312" } }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": "2020-09-30T18:22:51.648Z" }, "numViews": 36520312 }
{ "_id:": ObjectId("573a1391f29313caabcd9637"), "createdAt": ISODate("2020-09-30T18:22:51.648Z"), "numViews": NumberLong("36520312") }
讀取擴展 JSON
使用文檔類
您可以通過parse()
從Document
或BsonDocument
類調用靜態方法將擴展 JSON 字符串讀入 Java 文檔對象,具體取決於您需要的對象類型。此方法解析任何格式的擴展 JSON 字符串,並返回包含數據的該類的實例。
以下示例顯示了如何使用Document
該類將示例擴展 JSON 字符串讀取到Document
使用該parse()
方法的對象中 :
String ejsonStr = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," + "\"myNumber\": {\"$numberLong\": \"4794261\" }}}"; Document doc = Document.parse(ejsonStr); System.out.println(doc);
上述代碼的輸出應如下所示:
Document{{_id=507f1f77bcf86cd799439011, myNumber=4794261}}
有關更多信息,請參閱我們的文檔基礎頁面。
使用 BSON 庫
您還可以通過使用JsonReader
類將擴展 JSON 字符串讀入 Java 對象,而無需使用 MongoDB Java 驅動程序的文檔類。該類包含順序解析擴展 JSON 字符串的任何格式的字段和值的方法,並將它們作為 Java 對象返回。驅動程序的文檔類也使用這個類來解析擴展的 JSON。
以下代碼示例展示了如何使用JsonReader
該類將擴展 JSON 字符串轉換為 Java 對象:
String ejsonStr = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," + "\"myNumber\": {\"$numberLong\": \"4794261\" }}}"; JsonReader jsonReader = new JsonReader(ejsonStr); jsonReader.readStartDocument(); jsonReader.readName("_id"); ObjectId id = jsonReader.readObjectId(); jsonReader.readName("myNumber"); Long myNumber = jsonReader.readInt64(); jsonReader.readEndDocument(); System.out.println(id + " is type: " + id.getClass().getName()); System.out.println(myNumber + " is type: " + myNumber.getClass().getName()); jsonReader.close();
此代碼示例的輸出應如下所示:
507f1f77bcf86cd799439011 is type: org.bson.types.ObjectId
4794261 is type: java.lang.Long
有關更多信息,請參閱JsonReader API 文檔。
寫入擴展 JSON
使用文檔類
您可以從 的實例Document
或 BsonDocument
通過調用toJson()
方法編寫擴展 JSON 字符串,可選擇將 的實例傳遞給它JsonWriterSettings
以指定擴展 JSON 格式。
在此示例中,我們以輕松模式格式輸出擴展 JSON。
Document myDoc = new Document(); myDoc.append("_id", new ObjectId("507f1f77bcf86cd799439012")).append("myNumber", 11223344); JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build(); System.out.println(doc.toJson(settings));
此代碼示例的輸出應如下所示:
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": 11223344}
使用 BSON 庫
您還可以使用 BSON 庫和JsonWriter
類從 Java 對象中的數據輸出擴展 JSON 字符串。要構造 的實例JsonWriter
,請傳遞 Java 的子類Writer
以指定您希望如何輸出擴展 JSON。您可以選擇傳遞一個JsonWriterSettings
實例來指定擴展 JSON 格式等選項。默認情況下, JsonWriter
使用輕松模式格式。MongoDB Java 驅動程序的文檔類也使用這個類將 BSON 轉換為擴展 JSON。
以下代碼示例展示了如何使用JsonWriter
創建擴展 JSON 字符串並將其輸出到System.out
. 我們通過向outputMode()
builder 方法傳遞JsonMode.EXTENDED
常量來指定格式:
JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build(); try (JsonWriter jsonWriter = new JsonWriter(new BufferedWriter(new OutputStreamWriter(System.out)), settings)) { jsonWriter.writeStartDocument(); jsonWriter.writeObjectId("_id", new ObjectId("507f1f77bcf86cd799439012")); jsonWriter.writeInt64("myNumber", 11223344); jsonWriter.writeEndDocument(); jsonWriter.flush(); }
此代碼示例的輸出應如下所示:
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "myNumber": {"$numberLong": "11223344"}}
有關本節中提到的方法和類的更多信息,請參閱以下 API 文檔:
自定義 BSON 類型轉換
除了指定outputMode()
要格式化 JSON 輸出之外,您還可以通過將轉換器添加到 JsonWriterSettings.Builder
. 這些轉換器方法檢測 Java 類型並執行Converter
傳遞給它們的定義的邏輯。
以下示例代碼顯示了如何附加定義為 lambda 表達式的轉換器以簡化輕松模式 JSON 輸出。
JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED) .objectIdConverter((value, writer) -> writer.writeString(value.toHexString())) .dateTimeConverter( (value, writer) -> { ZonedDateTime zonedDateTime = Instant.ofEpochMilli(value).atZone(ZoneOffset.UTC); writer.writeString(DateTimeFormatter.ISO_DATE_TIME.format(zonedDateTime)); }) .build(); Document doc = new Document() .append("_id", new ObjectId("507f1f77bcf86cd799439012")) .append("createdAt", Date.from(Instant.ofEpochMilli(1601499609000L))) .append("myNumber", 4794261); System.out.println(doc.toJson(settings)));
此代碼的輸出應如下所示:
{"_id": "507f1f77bcf86cd799439012", "createdAt": "2020-09-30T21:00:09Z", "myNumber": 4794261}
在不指定轉換器的情況下,輕松模式 JSON 輸出應如下所示:
{"_id": {"$oid": "507f1f77bcf86cd799439012"}, "createdAt": {"$date": "2020-09-30T21:00:09Z"}, "myNumber": 4794261}
有關本節中提到的方法和類的更多信息,請參閱以下 API 文檔: