javascript
mongodb查询值不为空_NoSQL之MongoDB——BSON与JSON类型
BSON類型
BSON是一種用來存儲文檔和MongoDB執行遠程調用的二進制序列化格式。BSON規范位于bsonspec.org。
BSON支持以下數據類型,每種數據類型都有一個相應的數字和字符串別名,可以使用別名和$type操作符基于類型匹配模式檢索文檔。
比較/排序順序
當比較不同BSON類型的值時,MongoDB使用下面的比較順序,從最低到最高:
1.MinKey (內部類型)
2.Null
3.Numbers (ints, longs, doubles)
4.Symbol, String
5.Object
6.Array
7.BinData
8.ObjectId
9.Boolean
10.Date
11.Timestamp
12.Regular Expression
13.MaxKey (內部類型)
對于比較而言,MongoDB將一些類型看作是等價的。例如,數值類型在比較之前執行轉換。
3.0.0版本的變化:Date排在Timestamp 之前。之前的版本,Date和Timestamp 排序相同。
對于比較而言,MongoDB將不存在的字段看作空BSON 對象,例如,對{ } 和{ a: null }在排序中被看作是等價的。
對于數組而言,小于比較或者升序排序比較的是數組中最小的元素,大于比較或者降序排序比較的是數組中最大的元素。例如,比較一個只有一個元素的數組類型字段(例如 [ 1 ]))和非數組字段(例如2),比較的是1和2。
空數組(例如[])的比較被看作是小于空(null)或被看作丟失的字段。
對于BinData 類型,按下面順序排序:
1.首先,按數據的長度或大小排序。
2.然后,按BSON一個字節子類型排序。
3.最后,一個字節一個字節地比較。
下面的章節針對特定的BSON類型描述了特別的注意事項:
ObjectId
ObjectId占據存儲空間小、唯一、可被快速生成和索引。ObjectId類型值為12字節,前四個字節是一個時間戳,表示其被創建的時間:
- 前四個字節表示從UNIX新紀元來的秒數。
- 接下來的三個字節表示機器編號。
- 接下來的兩個字節表示進程ID。
- 最后三個字節表示以隨機數開始的計數。
在MongoDB中,集合中的文檔需要一個作為主鍵的唯一_id字段,如果沒有指定_id字段,MongoDB默認將ObjectId類型值作為_id字段值。例如,待插入文檔不包含頂級_id字段,MongoDB驅動就會添加一個ObjectId類型的_id字段。
另外,如果mongod接收的待插入文檔不包含_id字段,mongod將會添加一個ObjectId類型的_id字段。
MongoDB 客戶端應該添加一個值為ObjectId的_id字段,使用值為ObjectId的_id字段有如下好處:
- 在mongo shell中,你可以使用ObjectId.getTimestamp() 方法獲得ObjectId創建的時間。
- 給值為ObjectId的_id字段排序大體等價于按時間排序。
重要的:
在一秒之內,ObjectId值的順序與生成時間之間的關系并不是嚴格的。如果單系統中,多個系統或多個進程或多個線程在一秒內產生了多個ObjectId值,這些值并不會嚴格地按照插入順序展示。多客戶端之間的時鐘偏移也會導致不嚴格排序,即使這些值由客戶端驅動程序生成。
String
BSON 的String類型是UTF-8編碼的。一般來說,每種語言對應的驅動程序在執行序列化和反序列化BSON時將語言自身的string類型轉換為UTF-8編碼,這使得BSON string可以接受大多數國際字符。另外,使用$regex 查詢支持UTF-8編碼的正則表達式字符。
Timestamp
BSON 中有一個特殊的時間戳類型供MongoDB內部使用,并且不能和Date 配合使用。時間戳類型是64位的值:
- 第一個32位是time_t的值(從UNIX新紀元來的秒數)。
- 第二個32位是給定時間里一些操作的遞增序號。
在一個mongod實例中,時間戳的值是唯一的。
在復制功能中,oplog有一個ts字段,字段值使用DSON時間戳,它反映了操作時間。
注:
BSON時間戳類型(Timestape)是供MongoDB內部使用的。大多數情況下,開發應用程序時使用Date類型。
如果你所插入文檔的頂級字段是一個空值的時間戳類型(Timestape),MongoDB 服務器將會用當前的時間戳(Timestape)替換它。例如執行下面的操作:
var a = new Timestamp();
db.test.insert( { ts: a } );
然后,使用db.test.find()方法查詢,返回結果為:
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
如果ts是嵌入式文檔的一個字段,服務器會保持其為空值。
2.6版本中的變化:以前當插入文檔時,服務器僅僅會替換頭兩個空值時間戳類型(Timestape)字段,包括_id字段。現在服務器會替換任何的頂級字段。
Date
BSON 日期類型是64位整型,表示從UNIX新紀元(Jan 1, 1970)來的毫秒數。這一結果表示了可表達的約2億9000萬年范圍內的過去和未來。
官方的BSON規范指出DSON日期類型是通用協調時間(UTC datetime)。
BSON日期類型是有符號的,負值表示1970年之前的日期。
例如:
在mongo shell中,使用new Date()構建日期:var mydate1 = new Date()
在mongo shell中,使用ISODate()構建日期:var mydate2 = ISODate()
返回時間值的字符串:mydate1.toString()
返回日期中的月份,日期是基于0索引的,所以一月份就是:mydate1.getMonth()
MongoDB對JSON的擴展
JSON所表示的類型僅是BSON數據類型的子集。為了表示類型信息,MongoDB對JSON做如下擴展:
- strict模式。BSON類型的strict模式形式符合JSON RFC。任何的JSON分析器都能夠分析這些鍵值對形式的strict模式形式。然而,僅MongoDB內部的JSON分析器識別轉化為這種格式的信息。
- mongo Shell模式。MongoDB內部的JSON分析器和mongo shell都能解析這種模式。
這種形式被用于各種數據類型,這些類型依賴于JSON被解析的上下文環境。
解析器和支持的格式
以strict模式輸入
以下能夠解析strict模式形式,識別類型信息。
- REST Interfaces
- mongoimport
- 各種MongoDB工具的查詢選項
其他的JSON解析器,包括mongo shell 和db.eval()能夠解析鍵值對形式的strict模式表示,但是不能夠識別類型信息。
以mongo Shell 模式輸入
以下能夠解析mongo Shell模式表達,識別類型信息。
- REST Interfaces
- mongoimport
- 各種MongoDB工具的查詢選項
- mongo shell
以strict模式輸出
mongoexport 和REST and HTTP Interfaces以Strict模式輸出數據。
以mongo Shell 模式輸出
bsondump以mongo Shell 模式輸出數據。
BSON數據類型和相關的描述
下面展示了strict模式和mongo Shell模式的一些BSON數據類型及相關描述。
Binary
- 是base64編碼形式的二進制字符串
- 表示用一個字節指明數據類型。在strict模式中它是十六進制字符串,在mongo Shell模式中它是整數。
Date
在strict模式中,是ISO-8601數據格式的強制性時區字段,它的模板為:YYYY-MM-DDTHH:mm:ss.mmm。
當前的MongoDB JSON解析器不支持加載Unix新紀元之前的ISO-8601 字符串日期。當格式化系統的time_t 類型的紀元之前和之后的時間時,采用下面的格式:{ "$date" : { "$numberLong" : "" } }
在Shell 模式中,是一個64字節有符號整數的JSON形式,這個整數的表示形式為協調世界時間(UTC)的毫秒數。
Timestamp
- 為32位無符號整型UTC毫秒形式的JSON表達
- 為自增的32位無符號整型
Regular Expression(正則表達式)
- 是由有效的JSON字符構成的字符串
- 是由有效的JSON字符和轉義雙引號字符構成的字符串,但可能不包含轉義的正斜杠(/),
- 是一個包含以字母表示的正則表達式選項的字符串
- 是一個僅可能包含‘g’, ‘i’, ‘m’ 和‘s’ 的字符串,因為JavaScript和Mongo shell表示支持有限的選擇范圍,當轉化成這種表示時,不合格選項將被丟棄。
OID
DB Reference
- 是由有效的JSON字符構成的字符串。
- 是任何有效的JSON擴展類型。
Undefined Type
表示為JavaScript/BSON中未定義類型。
查詢文檔時不能使用未定義類型。將下面的文檔插入people 集合:
db.people.insert( { name : "Sally
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mongodb查询值不为空_NoSQL之MongoDB——BSON与JSON类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql增加某人信息_mysql 增加
- 下一篇: mysql 5.6.16 log_mys