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