日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【MongoDB】BSON类型

發(fā)布時(shí)間:2024/3/24 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【MongoDB】BSON类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、ObjectId

二、字符串(String)

三、時(shí)間戳(Timestamps)

四、日期(Date)


BSON是一種二進(jìn)制序列化格式,用于在MongoDB中存儲(chǔ)文檔和進(jìn)行遠(yuǎn)程過程調(diào)用。 有關(guān)BSON規(guī)范請(qǐng)?jiān)L問bsonspec.org

每種BSON類型標(biāo)識(shí)符都具有整數(shù)和字符串兩種表示方式,如下表:

類型

編號(hào)

別名

注釋

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

“l(fā)ong”

?

Decimal128

19

decimal

New in version 3.4

Min?Key

-1

minKey

?

Max?Key

127

maxKey

?

  • $ type運(yùn)算符支持使用這些值根據(jù)BSON類型查詢字段。 $ type還支持類型編號(hào)的別名,該別名與integer, decimal, double, ?long?BSON類型匹配。
  • $ type聚合運(yùn)算符返回其參數(shù)的BSON類型。
  • 如果$ isNumber聚合運(yùn)算符的參數(shù)為BSON類型integer, decimal, double, ?long.則返回true。(New in version 4.4)

注:$ type用于篩選字段值是指定的BSON?type(s)類型的文檔。例如:

{ field: { $type: <BSON type> } }

{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }

要查看字段類型,請(qǐng)參閱mongo Shell檢查字段類型

將BSON轉(zhuǎn)換為JSON,請(qǐng)參閱MongoDB擴(kuò)JSON

以下各節(jié)描述了BSON類型需要特別注意的事項(xiàng)。

?

一、ObjectId

ObjectId比較小,還是唯一的,可以快速生成并排序。ObjectId值的長(zhǎng)度為12個(gè)字節(jié),包括:

  • 4字節(jié)的時(shí)間戳(自Unix時(shí)代以來以秒為單位的時(shí)間戳值),代表ObjectId的創(chuàng)建
  • 5字節(jié)的隨機(jī)值
  • 3字節(jié)的遞增計(jì)數(shù)器,初始化值是隨機(jī)值

雖然BSON格式本身是低位字節(jié)序,但時(shí)間戳和計(jì)數(shù)器值卻是高位字節(jié)序,最有效字節(jié)出現(xiàn)在字節(jié)序列前端。

字節(jié)序,顧名思義字節(jié)的順序,就是大于一個(gè)字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序(一個(gè)字節(jié)的數(shù)據(jù)當(dāng)然就無需談順序的問題了)。

字節(jié)序分為兩類:Big-Endian和Little-Endian,定義如下:

a) Little-Endian就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。

b) Big-Endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。

c) 網(wǎng)絡(luò)字節(jié)序:TCP/IP各層協(xié)議將字節(jié)序定義為Big-Endian,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱之為網(wǎng)絡(luò)字節(jié)序。

在MongoDB中,存儲(chǔ)在集合中的每個(gè)文檔都需要一個(gè)唯一的_id字段作為主鍵。如果插入的文檔省略_id字段,則MongoDB驅(qū)動(dòng)程序會(huì)自動(dòng)為_id字段生成ObjectId類型值。

同理,通過upserttrue更新操作插入的文檔時(shí),若_id字段省略,也自動(dòng)生成。

MongoDB客戶端應(yīng)添加一個(gè)唯一ObjectId值的_id字段。在_id字段中使用ObjectIds具有以下額外優(yōu)點(diǎn):

  • 通過mongo shell,可以使用ObjectId.getTimestamp()方法查看ObjectId的創(chuàng)建時(shí)間。
  • 在存儲(chǔ)ObjectId值的_id字段上進(jìn)行排序大致相當(dāng)于按創(chuàng)建時(shí)間進(jìn)行排序。

重要提示

盡管ObjectId值應(yīng)隨時(shí)間增加,但不一定是單調(diào)的。這是因?yàn)樗麄?#xff1a;

  • ObjectId僅包含秒級(jí)時(shí)間戳,因此在同一秒內(nèi)創(chuàng)建的ObjectId值沒有保證的順序
  • 由客戶端生成,客戶端可能具有不同的系統(tǒng)時(shí)鐘。

參考資料:ObjectId()

?

二、字符串(String)

BSON字符串是UTF-8編碼。

通常,在對(duì)BSON進(jìn)行序列化和反序列化時(shí),每種編程語言的驅(qū)動(dòng)程序都會(huì)從該語言的字符串格式轉(zhuǎn)換為UTF-8。這樣就可以輕松地將大多數(shù)國(guó)際字符存儲(chǔ)在BSON字符串中。 [1]此外,MongoDB $ regex查詢?cè)趓egex字符串中支持UTF-8。

[1]對(duì)于一個(gè)UTF-8字符集的字符串,對(duì)字符串使用sort()是合理的。但是,由于內(nèi)部sort()使用C ++ strcmp api,因此排序順序可能會(huì)錯(cuò)誤地處理某些字符。

?

三、時(shí)間戳(Timestamps)

BSON有一種在MongoDB使用的特殊的內(nèi)部時(shí)間戳類型,并且與常規(guī)Date類型無關(guān)。此內(nèi)部時(shí)間戳記類型是64位值,其中:

  • 最重要的32位是time_t值(自Unix時(shí)代以來的秒數(shù))
  • 最不重要的32位是某1秒內(nèi)操作的遞增序數(shù)

由于BSON格式為低位優(yōu)先,因此首先存儲(chǔ)了最不重要的32位,但是mongod實(shí)例在所有平臺(tái)上始終將先比較time_t值,在比較序數(shù)值,而不管字節(jié)順序如何。

在一個(gè)mongod單實(shí)例中,時(shí)間戳值始終是唯一的。

在復(fù)本集中,操作日志(oplog)有一個(gè)ts字段。該字段值反映了BSON時(shí)間戳值的操作時(shí)間。

注意

BSON?timestamp?類型是MongoDB內(nèi)部使用。大多數(shù)情況下,在應(yīng)用程序開發(fā)中,需要使用BSON?date類型。更多信息,參考Date

如果插入的文檔包含帶有空時(shí)間戳值的頂級(jí)字段時(shí),MongoDB會(huì)將空時(shí)間戳值替換為當(dāng)前時(shí)間戳值,但以下情況除外:如果_id字段本身包含空的時(shí)間戳值,則它將始終按原樣插入并且不會(huì)被替換。

例:

插入有空時(shí)間戳值的文檔:

db.test.insertOne( { ts: new Timestamp() } );

然后運(yùn)行db.test.find()將返回一個(gè)文檔(內(nèi)容類似):

{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }

mongodb服務(wù)已將ts的空timestamp值替換為插入時(shí)的timestamp值。

?

四、日期Date

BSON Date是一個(gè)64位整數(shù),代表自Unix紀(jì)元(1970年1月1日)到現(xiàn)在的毫秒數(shù)。這樣可以追溯到過去和未來約2.9億年的日期范圍。

官方的BSON規(guī)范將BSON日期類型稱為UTC日期。

BSON日期類型已簽名。 [2]負(fù)值表示1970年之前的日期。

例如,在mongo shell中使用?new Date()函數(shù)創(chuàng)建Date:

var mydate1 = new Date()

例如,在mongo shell中使用ISODate()函數(shù)創(chuàng)建Date:

var mydate2 = ISODate()

例如,將日期值轉(zhuǎn)成字符串:

mydate1.toString()

例如,返回日期值的月份值;月索引從零開始,因此一月是月份0:

mydate1.getMonth()

?

[2]在2.0版之前,Date值被誤解為無符號(hào)整數(shù),這會(huì)影響日期字段上的排序,范圍查詢和索引。由于升級(jí)時(shí)不會(huì)重新創(chuàng)建索引。因此,如果使用較早版本的Date值創(chuàng)建了索引,并且1970年之前的日期與你的應(yīng)用程序相關(guān),請(qǐng)重新索引。

總結(jié)

以上是生活随笔為你收集整理的【MongoDB】BSON类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。