国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MongoDB指南---3、MongoDB基礎知識-數據類型

aervon / 3066人閱讀

摘要:如將構造函數作為函數進行調用即不包括的方式,返回的是日期的字符串表示,而非日期對象。如果不注意這一點,沒有始終使用日期構造函數,將得到一堆混亂的日期對象和日期的字符串。關于日期類的完整解釋,以及構造函數的參數格式,參見規范節。

上一篇文章:MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端
下一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell

本章開始部分介紹了文檔的基本概念,現在你已經會啟動、運行MongoDB,也會在shell中進行一些操作了。這一節的內容會更加深入。MongoDB支持將多種數據類型作為文檔中的值,下面將一一介紹。

2.6.1 基本數據類型

在概念上,MongoDB的文檔與JavaScript中的對象相近,因而可認為它類似于JSON。JSON(http://www.json.org)是一種簡單的數據表示方式:其規范僅用一段文字就能描述清楚(其官網證明了這點),且僅包含6種數據類型。這樣有很多好處:易于理解、易于解析、易于記憶。然而,從另一方面來說,因為只有null、布爾、數字、字符串、數組和對象這幾種數據類型,所以JSON的表達能力有一定的局限。
雖然JSON具備的這些類型已具有很強的表現力,但絕大多數應用(尤其是在與數據庫打交道時)都還需要其他一些重要的類型。例如,JSON沒有日期類型,這使原本容易的日期處理變得煩人。另外,JSON只有一種數字類型,無法區分浮點數和整數,更別說區分32位和64位數字了。再者,JSON無法表示其他一些通用類型,如正則表達式或函數。
MongoDB在保留JSON基本鍵/值對特性的基礎上,添加了其他一些數據類型。 在不同的編程語言下,這些類型的確切表示有些許差異。下面說明MongoDB支持的其他通用類型,以及如何在文檔中使用它們。

null

null用于表示空值或者不存在的字段:

{"x" : null}
布爾型

布爾類型有兩個值true和false:

{"x" : true}
數值

shell默認使用64位浮點型數值。因此,以下數值在shell中是很“正常”的:

{"x" : 3.14}

或:

{"x" : 3}

對于整型值,可使用NumberInt類(表示4字節帶符號整數)或NumberLong類(表示8字符帶符號整數),分別舉例如下:

{"x" : NumberInt("3")}
{"x" : NumberLong("3")}
字符串

UTF-8字符串都可表示為字符串類型的數據:

{"x" : "foobar"}
日期

日期被存儲為自新紀元以來經過的毫秒數,不存儲時區:

{"x" : new Date()} 
正則表達式

查詢時,使用正則表達式作為限定條件,語法也與JavaScript的正則表達式語法相同:

{"x" : /foobar/i}
數組

數據列表或數據集可以表示為數組:

{"x" : ["a", "b", "c"]} 
內嵌文檔

文檔可嵌套其他文檔,被嵌套的文檔作為父文檔的值:

{"x" : {"foo" : "bar"}}
對象id

對象id是一個12字節的ID,是文檔的唯一標識。詳見2.6.5節。

{"x" : ObjectId()}

還有一些不那么常用,但可能有需要的類型,包括下面這些。

二進制數據

二進制數據是一個任意字節的字符串。它不能直接在shell中使用。如果要將非UTF-8字符保存到數據庫中,二進制數據是唯一的方式。

代碼

查詢和文檔中可以包括任意JavaScript代碼:

{"x" : function() { /* ... */ }} 

另外,有幾種大多數情況下僅在內部使用(或被其他類型取代)的類型。在本書中,出現這種情況時會特別說明。
關于MongoDB數據格式的更多信息,參考附錄B。

2.6.2 日期

在JavaScript中,Date類可以用作MongoDB的日期類型。創建日期對象時,應使用new Date(…),而非Date(…)。如將構造函數(constructor)作為函數進行調用(即不包括new的方式),返回的是日期的字符串表示,而非日期(Date)對象。這個結果與MongoDB無關,是JavaScript的工作機制決定的。如果不注意這一點,沒有始終使用日期(Date)構造函數,將得到一堆混亂的日期對象和日期的字符串。由于日期和字符串之間無法匹配,所以執行刪除、更新及查詢等幾乎所有操作時會導致很多問題。
關于JavaScript日期類的完整解釋,以及構造函數的參數格式,參見ECMAScript規范15.9節(http://www.ecmascript.org)。
shell根據本地時區設置顯示日期對象。然而,數據庫中存儲的日期僅為新紀元以來的毫秒數,并未存儲對應的時區。(當然,可將時區信息存儲為另一個鍵的值)。

2.6.3 數組

數組是一組值,它既能作為有序對象(如列表、棧或隊列),也能作為無序對象(如數據集)來操作。
在下面的文檔中,"things"這個鍵的值是一個數組:

{"things" : ["pie", 3.14]}

此例表示,數組可包含不同數據類型的元素(在此,是一個字符串和一個浮點數)。實際上,常規的鍵/值對支持的所有值都可以作為數組的值,數組中甚至可以套嵌數組。
文檔中的數組有個奇妙的特性,就是MongoDB能“理解”其結構,并知道如何“深入”數組內部對其內容進行操作。這樣就能使用數組內容對數組進行查詢和構建索引了。例如,之前的例子中,MongoDB可以查詢出"things"數組中包含3.14這個元素的所有文檔。要是經常使用這個查詢,可以對"things"創建索引來提高性能。
MongoDB可以使用原子更新對數組內容進行修改,比如深入數組內部將pie改為pi。本書后面還會介紹更多這種操作的例子。

2.6.4 內嵌文檔

文檔可以作為鍵的值,這樣的文檔就是內嵌文檔。使用內嵌文檔,可以使數據組織方式更加自然,不用非得存成扁平結構的鍵/值對。
例如,用一個文檔來表示一個人,同時還要保存他的地址,可以將地址信息保存在內嵌的"address"文檔中:

{
    "name" : "John Doe",
    "address" : {
        "street" : "123 Park Street",
        "city" : "Anytown",
        "state" : "NY"
    }
}  

上面例子中"address"鍵的值是一個內嵌文檔,這個文檔有自己的"street"、"city"和"state"鍵以及對應的值。
同數組一樣,MongoDB能夠“理解”內嵌文檔的結構,并能“深入”其中構建索引、執行查詢或者更新。
稍后會深入討論模式設計,但是從這個簡單的例子也可以看得出內嵌文檔可以改變處理數據的方式。在關系型數據庫中,這個例子中的文檔一般會被拆分成兩個表中的兩個行 (“people”和“address”各一行)。在MongoDB中,就可以直接將地址文檔嵌入到人員文檔中。使用得當的話,內嵌文檔會使信息的表示方式更加自然(通常也會更高效)。
MongoDB這樣做的壞處就是會導致更多的數據重復。假設“address”是關系數據庫中的一個獨立的表,我們需要修正地址中的拼寫錯誤。當我們對“people”和“address”執行連接操作時,使用這個地址的每個人的信息都會得到更新。但是在MongoDB中,則需要對每個人的文檔分別修正拼寫錯誤。

2.6.5 _id和ObjectId

MongoDB中存儲的文檔必須有一個"_id"鍵。這個鍵的值可以是任何類型的,默認是個ObjectId對象。在一個集合里面,每個文檔都有唯一的"_id",確保集合里面每個文檔都能被唯一標識。如果有兩個集合的話,兩個集合可以都有一個"_id"的值為123,但是每個集合里面只能有一個文檔的"_id"值為123。

1. ObjectId

ObjectId是"_id"的默認類型。它設計成輕量型的,不同的機器都能用全局唯一的同種方法方便地生成它。這是 MongoDB采用ObjectId,而不是其他比較常規的做法(比如自動增加的主鍵)的主要原因,因為在多個服務器上同步自動增加主鍵值既費力又費時。因為設計MongoDB的初衷就是用作分布式數據庫,所以能夠在分片環境中生成唯一的標示符非常重要。
ObjectId使用12字節的存儲空間,是一個由24個十六進制數字組成的字符串(每個字節可以存儲兩個十六進制數字)。由于看起來很長,不少人會覺得難以處理。但關鍵是要知道這個長長的ObjectId是實際存儲數據的兩倍長。
如果快速連續創建多個ObjectId,會發現每次只有最后幾位數字有變化。另外,中間的幾位數字也會變化(要是在創建的過程中停頓幾秒鐘)。這是ObjectId的創建方式導致的。ObjectId的12字節按照如下方式生成:

2. 自動生成_id

前面講到,如果插入文檔時沒有"_id"鍵,系統會自動幫你創建一個。可以由MongoDB服務器來做這件事,但通常會在客戶端由驅動程序完成。這一做法非常好地體現了MongoDB的哲學:能交給客戶端驅動程序來做的事情就不要交給服務器來做。這種理念背后的原因是,即便是像MongoDB這樣擴展性非常好的數據庫,擴展應用層也要比擴展數據庫層容易得多。將工作交由客戶端來處理,就減輕了數據庫擴展的負擔。

上一篇文章:MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端
下一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43991.html

相關文章

  • MongoDB指南---3MongoDB基礎知識-數據類型

    摘要:如將構造函數作為函數進行調用即不包括的方式,返回的是日期的字符串表示,而非日期對象。如果不注意這一點,沒有始終使用日期構造函數,將得到一堆混亂的日期對象和日期的字符串。關于日期類的完整解釋,以及構造函數的參數格式,參見規范節。 上一篇文章:MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端下一篇文章:MongoDB指南---4、MongoDB基礎知識-使用M...

    tunny 評論0 收藏0
  • MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端

    摘要:上一篇文章指南簡介下一篇文章指南基礎知識數據類型非常強大但很容易上手。把同種類型的文檔放在一個集合里,數據會更加集中。命名集合使用名稱進行標識。集合名不能是空字符串。簡單起見,數據庫名應全部小寫。 上一篇文章:MongoDB指南---1、MongoDB簡介下一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型 MongoDB非常強大但很容易上手。本章會介紹一些Mon...

    SnaiLiu 評論0 收藏0
  • MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端

    摘要:上一篇文章指南簡介下一篇文章指南基礎知識數據類型非常強大但很容易上手。把同種類型的文檔放在一個集合里,數據會更加集中。命名集合使用名稱進行標識。集合名不能是空字符串。簡單起見,數據庫名應全部小寫。 上一篇文章:MongoDB指南---1、MongoDB簡介下一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型 MongoDB非常強大但很容易上手。本章會介紹一些Mon...

    W4n9Hu1 評論0 收藏0
  • MongoDB指南---5、創建、刪除文檔

    摘要:例如,假設要刪除集合中所有為的人刪除數據是永久性的,不能撤銷,也不能恢復。刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用直接刪除集合會更快然后在這個空集合上重建各項索引。上一篇文章指南基礎知識使用下一篇文章指南更新文檔 上一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell下一篇文章:MongoDB指南---6、更新文檔 本章會介紹...

    jas0n 評論0 收藏0
  • MongoDB指南---5、創建、刪除文檔

    摘要:例如,假設要刪除集合中所有為的人刪除數據是永久性的,不能撤銷,也不能恢復。刪除速度刪除文檔通常很快,但是如果要清空整個集合,那么使用直接刪除集合會更快然后在這個空集合上重建各項索引。上一篇文章指南基礎知識使用下一篇文章指南更新文檔 上一篇文章:MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell下一篇文章:MongoDB指南---6、更新文檔 本章會介紹...

    int64 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<