MongoDB權威指南第二版學習筆記二

來源:互聯網
上載者:User

標籤:浮點   var   啟動   load   mem   init   short   batch   字元   

資料類型

MongoDB在保留JSON基本鍵/值對特性的基礎上,添加了其他一些資料類型。

null

null用於表示空值或者不存在的欄位:{“x”:null} 

布爾型

布爾類型有兩個值true和false {“x”:true} 

數值

shell預設使用64位浮點型數值。 {“x”:3.14} 或 {“x”:3} 

對於整型值,可使用NumberInt類(表示4位元組帶正負號的整數)或NumberLong類(表示8字元帶正負號的整數) {“x”:NumberInt(”3”)} {“x”:NumberLong(“3”)} 

字串

utf-8字串都可以表示為字串類型的資料: {“x”:”foobar”} 

日期

日期被儲存為自新世紀以來經過的毫秒數,不儲存時區: {“x”:new Date()} 

建立日期對象時,應使用 new Date() ,而非Date(),後者返回的是日期的字串表示,而非日期 Date對象。這個結果與MongoDB無關,是js的工作機制決定的。由於日期和字串之間無法匹配,所以執行刪改查等幾乎所有操作時會導致很多問題。

> db.blog.insert({"x":Date()})WriteResult({ "nInserted" : 1 })> db.blog.find(){ "_id" : ObjectId("584ea42d3bb80d550a5914fe"), "x" : "Mon Dec 12 2016 21:20:45 GMT+0800 (CST)" }> db.blog.insert({"x":new Date()})WriteResult({ "nInserted" : 1 })> db.blog.find(){ "_id" : ObjectId("584ea42d3bb80d550a5914fe"), "x" : "Mon Dec 12 2016 21:20:45 GMT+0800 (CST)" }{ "_id" : ObjectId("584ea4573bb80d550a5914ff"), "x" : ISODate("2016-12-12T13:21:27.361Z") }
Regex

查詢時,使用Regex作為限定條件 {“x”:/foobar/i} 

數組

資料列表或數組集可以表示為數組: {“x”:[“a”,”b”,”c”]} 

數組是一組值,它既能作為有序對象(如列表、棧或隊列),也能作為無序對象(如資料集)來操作。

數組中可包含不同資料類型的元素 {“things”:[“pie”,3.14]} 。只要是常規的鍵/值對支援的所有值都可以作為數組的值,數組中甚至可以嵌套數組。

內嵌文檔

文檔可內嵌其他文檔,被嵌套的文檔作為父文檔的值: {“x”:{“foo”,”bar”}} 

使用內嵌文檔,可以使資料群組織更加自然,不用非得存成扁平結構的鍵/值對。

> post={... "user":{... "name":"yyb",... "address":{... "street":"123 Park Street",... "city":"Anytown",... "state":"NY"...     }...   }... }{        "user" : {                "name" : "yyb",                "address" : {                        "street" : "123 Park Street",                        "city" : "Anytown",                        "state" : "NY"                }        }}> db.blog.insert(post)WriteResult({ "nInserted" : 1 })> db.blog.find(){ "_id" : ObjectId("584ea90fce4f8e1bf30ba07d"), "user" : { "name" : "yyb", "address" : { "street" : "123 Park Street", "city" : "Anytown", "state" : "NY" } } }
對象id

對象id是一個12位元組的ID,是文檔的唯一標識 {“x”:ObjectId()} 

MongoDB中儲存的文檔必須有一個“_id”鍵。確保集合中的每個文檔都能被唯一標識。

這個鍵的值可以是任意類型的,預設是個ObjectId對象。對象id設計成輕量型的,不同的機器都能用全域唯一的同種方法方便的產生它。這對於在分區環境中產生唯一的標示符非常重要。

ObjectId的前4個位元組是從標準紀元開始的時間戳記,單位為秒。這會帶來一些有用的屬性。

  • 時間戳記,與隨後的5位元組組合起來,提供了秒層級的唯一性。
  • 由於時間戳記在前,這意味著objectid大致會按插入的順序排列。
  • 這4位元組也隱含了建立文檔的時間。絕大多數驅動程式都會提供一個方法,用於從objectId擷取這些資訊。

接下來的3位元組是所在主機的唯一識別碼。通常是機器主機名稱的散列值。這樣就可以確保不同主機產生不同的objectId,不產生衝突。

為了確保在同一機器上並發的多個進程產生的ObjectId是唯一的,接下來的兩個位元組來自產生objectId的進程的進程標識符PID。

前9位元組保證了同一秒鐘不同機器不同進程產生的ObjectId是唯一的。最後3位元組是一個自動增加的計數器,確保相同進程同一秒產生的ObjectId也是不一樣的。一秒鐘最多允許每個進程擁有2563個不同的ObjectId。

如果插入文檔時沒有“_id”鍵,系統會自動幫你建立一個。可以由MongoDB服務完成,但通常會在用戶端由驅動程式完成。

位元據

位元據是一個任意位元組的字串。它不能直接在shell中使用。如果要將非utf-8字元儲存在資料庫中,位元據是唯一的方式。

代碼

查詢和文檔中可以包含任意js代碼 {“x”:function(){/*...*/}} 

另外,有幾種大多數情況僅在內部使用(或被其他類型取代)的類型。

使用MongoDB shell

將shell串連到任何MongoDB執行個體:mongo 機器名:連接埠/資料庫名 

下面使用我的Linux串連我的Windows

[[email protected] mongodb]# ./bin/mongo 192.168.1.111:27017/test MongoDB shell version: 3.2.10connecting to: 192.168.1.111:27017/testServer has startup warnings: 2016-12-12T14:14:40.558+0800 I CONTROL  [initandlisten] 2016-12-12T14:14:40.558+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.2016-12-12T14:14:40.558+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.2016-12-12T14:14:40.558+0800 I CONTROL  [initandlisten] > show dbsadmin  0.000GBlocal  0.000GBtest   0.000GB> db.test.find()> db.test.insert({"x":100})WriteResult({ "nInserted" : 1 })> > db.test.find(){ "_id" : ObjectId("584fe47a36b03fda10897c99"), "x" : 100 }

在我的windows中查看效果

啟動時不串連任何資料庫,使用 --nodb 參數啟動shell,啟動之後,在需要時運行new Mongo(hostname)命令就可以串連到想要的mongod了。任何時候都可以使用這些命令來串連到不同的資料庫或者伺服器。

[[email protected] mongodb]# ./bin/mongo --nodbMongoDB shell version: 3.2.10> conn=new Mongo("192.168.1.111:27017")connection to 192.168.1.111:27017> db=conn.getDB("test")test> db.test.find(){ "_id" : ObjectId("584fe47a36b03fda10897c99"), "x" : 100 }

Shell內建了協助文檔,可以使用 help 命令查看,可以通過db.help()查看資料庫層級的協助,使用db.foo.help()查看集合層級的協助,使用db.foo.update方式查看函數的js實現代碼。

> help        db.help()                    help on db methods        db.mycoll.help()             help on collection methods        sh.help()                    sharding helpers        rs.help()                    replica set helpers        help admin                   administrative help        help connect                 connecting to a db help        help keys                    key shortcuts        help misc                    misc things to know        help mr                      mapreduce        show dbs                     show database names        show collections             show collections in current database        show users                   show users in current database        show profile                 show most recent system.profile entries with time >= 1ms        show logs                    show the accessible logger names        show log [name]              prints out the last segment of log in memory, ‘global‘ is default        use <db_name>                set current database        db.foo.find()                list objects in collection foo        db.foo.find( { a : 1 } )     list objects in foo where a == 1        it                           result of the last line evaluated; use to further iterate        DBQuery.shellBatchSize = x   set default number of items to display on shell        exit                         quit the mongo shell
使用shell執行指令碼

mongo shell會依次執行傳入的指令碼,然後退出。

E:\Program Files\MongoDB\Server\3.4\bin>mongo js1.jsMongoDB shell version v3.4.0-rc3-7-ge24e12cconnecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.4.0-rc3-7-ge24e12cI am yyb in the script1.js

首先:指令碼的位置須放在mongo.exe 所在的目錄,也就是bin目錄下。其次如果配置了環境變數,直接mongo js1.js是不行的。比如:

C:\Users\yang>mongo js1.js2016-12-13T21:25:36.265+0800 E - [main] file [js1.js] doesn‘t existfailed to load: js1.js

使用指定的主機/連接埠上的mongod運行指令碼,需要先指定地址,然後再跟上指令碼的檔案的名稱。

在指令碼中使用print()函數將內容輸出到標準輸出,這樣就可以在shell中使用管道命令。如果將shell指令碼的輸出管道給另一個使用--quiet選項的命令,就可以讓shell不列印“MongoDB shell version...”提示。

[[email protected] bin]# ./mongo --quiet 192.168.1.111:27017/test js1.jsI like to read and study

可以使用load()函數,從互動式shell中運行指令碼:

> load("js1.js")I like to read and studytrue

在指令碼中可以訪問db變數,以及其他全域變數。然而,shell輔助函數(比如:“use db”和“show collections”)不可以在檔案中使用。不過,這些輔助函數都有對應的js函數。

可以使用指令碼將變數注入到shell

/***串連到指定的資料庫,並且將db指向這個串連*/var connectTo=function(port,dbname){if(!port){port=27017;}if (!dbname) {dbname="test";}db=connect("localhost:"+port+"/"+dbname);return db;}
> typeof connectToundefined> load("defineConnectTo.js")true> typeof connectTofunction

如果在shell中載入這個指令碼,connectTo函數就可以使用了。

MongoDB權威指南第二版學習筆記二

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.