從json到python解析python,從bson到monogdb

1.JSON

JSON是JavaScript Object Notation的縮寫,中文譯爲JavaScript對象表示法。用來做爲數據交換的文本格式,做用相似於XML,而2001年Douglas Crockford提出的目的就是爲了取代XML,它不是一種編程語言,僅用來描述數據結構。python

它只是一個字符串,它只是一個有規則的字符串,或者說帶有特定數據結構的字符串。(重點)而後它的表達(表現)形式是鍵值對的。正則表達式

JSON基於兩種結構:"名稱/值」對  的集合(A collection of name/value pairs),在不一樣的編程語言中有不一樣的描述數據庫

如:對象(object),紀錄(record),結構(struct),字典(dictionary) 哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array) 值的有序列表。編程

在大部分語言中,它被實現爲數組(array),矢量(vector),列表(list),序列(sequence)json

1.二、JSON語法規則

JSON的語法能夠表示如下三種類型的值:簡單值、JSON對象和數組。數組

(1)簡單值服務器

// 簡單值
"Hello World!" // 字符串
99 // 數值
true // 布爾型
false // 布爾型
null

// 在JSON中不能使用的值
NaN // 數值不能是NaN
Infinity // 數值不能是Infinity
undefined // 在JSON也不可使用JavaScript中的undefined
'Hello World!' // 字符串必須使用雙引號表示,不能使用單引號
0x1 // 數值必須以十進制表示,不能使用十六進制

(2)對象網絡

對象是一組有序的鍵值對的數據組成的數據類型。鍵值對中,值能夠是簡單值,也能夠是對象和數組(數組也是用來表示JSON的數據類型)數據結構

// 對象,對象的屬性名必須使用雙引號,值要是字符串也必須使用雙引號
{
  "name": "Andy",
  "age": 18,
  "isStudent": true,
  "isLeader": false,
  "mark": null,
  "school": {
    "name": "BIT",
    "region": "Beijing" // 這個地方不能有逗號,由於是對象的最後一個屬性成員
  } // 這個地方也不能夠有逗號,由於也是對象的最後一個屬性成員
}

(3)數組less

數組是由一組有序的數組組成的列表。在數組中,值能夠是簡單值,也能夠是對象和數組。

// 示例一
["Andy", "Ruby", "Danny", "Peter", "Lisa"]
// 示例二
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
// 示例三
[
  {"name": "Andy", "age": 18},
  {"name": "Ruby", "age": 18},
  {"name": "Danny", "age": 20}
]
// 示例四
[
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8]
]

2.2python解析json

使用Python編碼和解析Json 

Python內置了json包來幫助咱們完成對json的操做。

將Python的字典結構導出到json使用json.dumps() ,將json讀成Python的字典結構,使用json.loads() 。

若是不是針對string操做而是對文件操做,分別使用json.load()函數和json.dump()函數。

import json
 
python_data = {
 'name' : 'wqbin',
 'shares' : 100,
 'price' : 542.23
}
 
json_str = json.dumps(python_data)
python_data = json.loads(json_str)
 
# Writing JSON python_data to file
with open('python_data.json', 'w') as f:
 json.dump(python_data, f)
 
# Reading python_data back
with open('python_data.json', 'r') as f:
 python_data = json.load(f)

python數據類型與json數據類型對比:

 

 

 

2.Bson

2.1 bson的概念

BSON(Binary Serialized Document Format)是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON,它和JSON同樣,支持內嵌的文檔對象和數組對象,可是BSON有JSON沒有的一些數據類型,如Date和BinData類型。

BSON能夠作爲網絡數據交換的一種存儲形式,這個有點相似於Google的Protocol Buffer,可是BSON是一種schema-less的存儲形式,它的優勢是靈活性高,但它的缺點是空間利用率不是很理想。

BSON有三個特色:輕量性、可遍歷性、高效性。

{「hello":"world"} 這是一個BSON的例子,其中"hello"是key name,它通常是cstring類型,字節表示是cstring::= (byte*) "/x00" ,其中*表示零個或多個byte字節,/x00表示結束符;後面的"world"是value值,它的類型通常是string,double,array,binarydata等類型。

2.2 使用狀況

MongoDB使用了BSON這種結構來存儲數據和網絡數據交換。

把這種格式轉化成文檔(Document)這個概念,由於BSON是schema-free的,因此在MongoDB中所對應的文檔也有這個特徵,這裏的一個Document也能夠理解成關係數據庫中的一條記錄(Record),

文檔是對數據的抽象,它被使用在Client端和Server端的交互中。全部的Client端(各類語言的Driver)都會使用這種抽象。

當Client端要將寫入文檔,使用查詢等等操做時,須要將文檔編碼爲BSON格式,而後再發送給Server端。一樣,Server端的返回結果也是編碼爲BSON格式再放回給Client端的。

MongoDB以BSON作爲其存儲結構的一種重要緣由是其可遍歷性。

使用BSON格式出於如下3種目的:
  • 效率

    BSON是爲效率而設計的,它只須要使用不多的空間。即便在最壞的狀況下,BSON格式也比JSON格式再最好的狀況下存儲效率高。

  • 傳輸性

    在某些狀況下,BSON會犧牲額外的空間讓數據的傳輸更加方便。好比,字符串的傳輸的前綴會標識字符串的長度,而不是在字符串的末尾打上結束的標記。這樣的傳輸形式有利於MongoDB修改傳輸的數據

  • 性能
    BSON格式的編碼和解碼都是很是快速的。它使用了C風格的數據表現形式,這樣在各類語言中均可以高效地使用。

2.3數據類型演示

//null值

db.mycol.insert({x:null})
WriteResult({ "nInserted" : 1 })

//布爾型

db.mycol.insert({x:true})
WriteResult({ "nInserted" : 1 })

//小數

db.mycol.insert({x:3.1515})
WriteResult({ "nInserted" : 1 })

//整數

db.mycol.insert({x:3})
WriteResult({ "nInserted" : 1 })

//4字節帶符合整數

db.mycol.insert({x:NumberInt("3")})
WriteResult({ "nInserted" : 1 })

//8字節帶符號整數

db.mycol.insert({x:NumberLong("3")})

WriteResult({ "nInserted" : 1 })

//字符型

db.mycol.insert({x:"robin"})
WriteResult({ "nInserted" : 1 })

//日期型

db.mycol.insert({x:new Date()})
WriteResult({ "nInserted" : 1 })

//正則表達式

db.mycol.insert({x:/u01/i})
WriteResult({ "nInserted" : 1 })

//數組

db.mycol.insert({x:["a","b","c"]})
WriteResult({ "nInserted" : 1 })

//嵌套文檔

db.mycol.insert({x:{y:"nested"}})
WriteResult({ "nInserted" : 1 })

//對象id

db.mycol.insert({x:ObjectId()})
WriteResult({ "nInserted" : 1 })

//代碼段

db.mycol.insert({x:function(){/ This is a test code /}})
WriteResult({ "nInserted" : 1 })

//undefined類型

db.mycol.insert({name:undefined});
WriteResult({ 「nInserted」 : 1 })

mongoDB數據類型的比較與排序優先級

  1. MinKey (internal type)
  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 (internal type)

2.3格式案例

BSon和JSON同樣,支持內嵌的文檔對象和數組對象,可是BSON有JSON沒有的一些數據類型,如Date和BinData類型。
1.簡單型
{
    title:"MongoDB",
    last_editor:"192.168.1.122",
    last_modified:new Date("27/06/2011"),
    body:"MongoDB introduction",
    categories:["Database","NoSQL","BSON"],
    revieved:false
}

2.複雜嵌套型

{
    name:"lemo",
    age:"12",
    address:{
        city:"suzhou",
        country:"china",
        code:215000
    },
    scores:[
        {"name":"english","grade:3.0},
        {"name":"chinese","grade:2.0}
    ]
}

2.4mongo與Bson

數據文件

在MongoDB的數據文件夾中(默認路徑是/data/db)由構成數據庫的全部文件。 每個數據庫都包含一個.ns文件和一些數據文件,其中數據文件會隨着數據量的增長而變多。
因此若是有一個數據庫名字叫作foo,那麼構成foo這個數據庫的文件就會由foo.ns,foo.0,foo.1,foo.2等等組成。
數據文件每新增一次,大小都會是上一個數據文件的2倍,每一個數據文件最大2G。這樣的設計有利於防止數據量較小的數據庫浪費過多的空間,同時又能保證數據量較大的數據庫有相應的空間使用。
MongoDB會使用預分配方式來保證寫入性能的穩定(這種方式可使用–noprealloc關閉), 預分配的方式能夠減小碎片。預分配在後臺進行,而且每一個預分配的文件都用0進行填充。這會讓MongoDB始終保持額外的空間和空餘的數據文件,從而避免了數據增加過快而帶來的分配磁盤空間引發的阻塞。

名字空間和盤區

每個數據庫都由多個名字空間組成,每個名字空間存儲了相應類型的數據。數據庫中的每個Collection都有各自對應的名字空間,索引文件一樣也有名字空間。全部名字空間的元數據都存儲在.ns文件中。

名字空間中的數據在磁盤中分爲多個區間,這個叫作盤區。在下圖中,foo這個數據庫包含3個數據文件,第三個數據文件屬於空的預分配文件。頭兩個數據文件被分爲了相應的盤區對應不一樣的名字空間。

每個名字空間能夠包含多個不一樣的盤區,這些盤區並非連續的。與數據文件的增加相同,每個名字空間對應的盤區大小的也是隨着分配的次數不斷增加的。
這樣作的目的是爲了平衡名字空間浪費的空間與保持某一個名字空間中數據的連續性。還有一個須要注意的名字空間: $freelist,這個名字空間用於記錄再也不使用的盤區(被刪除的Collection或索引)。
每當名字空間須要分配新的盤區的時候,都會先查看$freelist是否有大小合適的盤區可使用。

內存映射存儲引擎

MongoDB目前支持的存儲引擎爲內存映射引擎當MongoDB啓動的時候,會將全部的數據文件映射到內存中,而後操做系統會託管全部的磁盤操做。

(這裏的意思就是,MongoDB中的數據能夠經過Java中的new操做設置一個對象,進而將對象映射到內存中,內存根據指針等實現對磁盤的操做)

這種存儲引擎有如下幾種特色:

  1. MongoDB中關於內存管理的代碼很是精簡,畢竟相關的工做已經有操做系統進行託管。
  2.  MongoDB服務器使用的虛擬內存將很是巨大,並將超過整個數據文件的大小。不用擔憂,操做系統會去處理這一切。
  3. MongoDB沒法控制數據寫入磁盤的順序,這樣將致使MongoDB沒法實現writeahead日誌的特性。因此,若是MongoDB但願提供一種durability的特性,須要實現另一種存儲引擎。
  4.  32位系統的MongoDB服務器每個Mongod實例只能使用2G的數據文件。這是因爲地址指針只能支持32位。

關於_id與Object_Id

mongoDB中每個文檔都必須有一個"_id"鍵,該鍵等同於RDBMS中的主鍵,只不過這個主鍵是由mongoDB自動生成
"_id"鍵的值可使用任意類型,能夠不使用系統建立,而由用戶自定義的規則生成
"_id"爲輕量級,全局惟一,可類比爲MySQL數據中的GTID,也用於解決不一樣機器副本集複製時惟一性問題

a 4-byte value representing the seconds since the Unix epoch,  //時間戳
a 3-byte machine identifier,                                   //機器惟一標識碼
a 2-byte process id, and                                       //進程ID
a 3-byte counter, starting with a random value.                //隨機數
db.mycol.findOne()
{ 「_id」 : ObjectId(「57ce2d4cce8685a6fd9df3a3」), 「x」 : null }

57ce2d4c //時間戳 ==>1473129804 ==> 2016/9/6 10:43:24

ce8685 //機器惟一標識碼

a6fd //進程ID

9df3a3 //隨機數
相關文章
相關標籤/搜索