MongoDB自帶JavaScript shell
MongoDB shell
- 命令db查看當前指向哪個數據庫
- 創建 db.col.insert(post)
- 讀取db.col.find()
db.col.findOne() - 更新post.comments=[] db.col.update({title:”My Blog Post”},post)
update函數有兩個參數至少,第一個參數用於匹配待更新的文檔,第二個參數是新的文檔。 - 刪除
db.col.remove({title:"My Blog Post"})
db.col.remove() //刪除集合中的所有文檔
db.col.drop() //刪除集合
數據類型
JSON只有null,布爾,數字,字符串,數組和對象這幾種數據類型。
MongoDB數據類型:
- null
- 布爾
- 數值 默認64位浮點數型數值;NumberInt(“3”)表示4字節帶符號整數;NumberLong(“3”)表示8字節帶符號整數;
- 字符串 支持UTF-8字符串
- 日期; 不區分時區。自新紀元以來的毫秒數;要用new Date()而非Date()後者返回的日期的字符串而非日期的對象;
- 正則表達式
- 數組
- 數組可以包含不同類型的元素
- 數組中甚至可以嵌套數組
- MongoDB能夠理解數組的結構,並深入其內部對其內容進行操作;
- 內嵌文檔
對象ID ;12字節的id,是文檔的唯一標識。ObjectId()
每個集合裏的文檔的ID是唯一的,不同集合文檔ID可以重複
前4個字節是時間戳,從標準紀元開始,單位爲秒;
4-6字節是機器主機名的散列值(hash);
7-8字節是產生ObjectId的進程的進程標識符(PID),用於區分同一機器上的多線程;
9-11字節是一個自動增加的計數器,保證同一同一秒產生的ObjectId也是不同的;一秒鐘同時允許2563個ObjectId.
二進制數據;非UTF-8字符串要以這種形式保存
- 代碼;查詢和文檔中可以插入任意JavaScript代碼;
使用
- 連接到指定機器上的數據庫:mongo 機器名:端口/數據庫名
- 啓動shell不連接任何數據庫:
mongo -nodb
- 再連接到指定數據庫:
conn = new Mongo("some-host:30000")
db = conn.getDB("myDB")
> help
獲取幫助- 只輸入函數名可以查看函數的實現代碼
mongo script1.js script2.js script3.js
mongo --quiet server-1:30000/foo scirpt1.js script2.js
指定主機,數據庫,執行腳本- shell輔助函數不能在文件中使用,如
show dbs
對應db.getMongo().getDbs()
show collections
對應db.getCollectionNames()
use foo
對應db.getSisterDB("foo")
load("defineConnectionTo.js")
加載執行> run("ls","-l","/usr/local")
用來執行命令行程序- 集合命名如果包含保留字的話
db.getCollection("version")
> Object.bsonsize(doc)
查看文檔大小;要求文檔大小必須小於16MB- 文檔替換
> var jone = db.col.findOne({name:"jone"})
> jone.releationships = {friends:jone.friends,enemies:jone.enemies}
{ "friends" : 32, "enemies" : 2 }
> jone.usename=jone.name
jone
> delete jone.friends
true
> delete jone.enemies
true
> delete jone.name
true
> db.col.update({name:"jone"},jone)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone" }
>
- 原子性的更新修改器,對指定文檔的某些字段進行更新
//$inc修改器用來增加一個鍵的值,如果不存在就創建這個鍵
> db.col.update({usename:"jone"},{"$inc":{friends:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "friends" : 1 }
> db.col.update({usename:jone},{"$set":{friends:2}})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "friends" : 1 }
> db.col.update({usename:"jone"},{"$set":{friends:2}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "friends" : 2 }
//unst將這個鍵刪除
> db.col.update({usename:"jone"},{"$unset":{friends:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone" }
- “$push”向數組末尾加一個元素,如果數組不存在,則創建一個新的數組
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone" }
> db.col.update({usename:"jone"},{"$push":{comments:{name:"joe",email:"[email protected]",content:"nice"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "comments" : [ { "name" : "joe", "email" : "[email protected]", "content" : "nice" } ] }
> db.col.update({usename:"jone"},{"$push":{comments:{name:"bob",email:"[email protected]",content:"good"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "comments" : [ { "name" : "joe", "email" : "[email protected]", "content" : "nice" }, { "name" : "bob", "email" : "[email protected]", "content" : "good" } ] }
- “
each“子操作符與“ push”結合可以一次插入多個元素 - “$slice”限制數組的長度
- “$sort”排序
- “$ne”條件檢驗,比如在向某個數組中插入數據時,如果不存在某個內容就插入
- “$addToSet”也是驗重
{"$pop":{"key":1}}
從數組末尾刪除一個元素
{"$pop":{"key":-1}}
從數組頭部刪除一個元素
{"$pull":{tem:"flower"}}
刪除數組中的所有”flower”
可通過下標訪問數組comments.0
數組的第一項- 定位符”$”
db.col.update({"commments.author:"Jone"},{"$set":{"comments.$.authors:"Jim"}})
- $inc因爲就地修改,不改變文檔結構,所以比較快;數組修改器可能要改變文檔大小,會慢一些;
- 填充因子(paddingFactor)是MongoDB爲每個新文檔預留的增長空間。讓一個文檔增大,填充因子會變大,如果後面的更新導致了更多次的文檔移動,填充因子會持續增大;如果不再有文檔移動,填充因子會慢慢降低到1.
- upsert更新是在找到符合更新條件的對象時,進行更新;找不到時就按update設定的條件新建一個文檔;
- $setOnInsert創建文檔的時候創建字段並賦值,以後所有的更新操作時,這個值不再改變;
- update函數的第四個參數爲true表示當有多個符合條件的文檔時,全部更新;
- getLastError命令可以返回最後一次操作的相關信息;鍵n的值表示被更新的文檔的數量
db.runCommand({getLastError:1})
- findAndModify返回符合更新條件的文檔更新前的值;
ps = db.runCommand({"findAndModify": "processes",
query:{status:"READY"},
sort:{priority:-1},
update:{"$set":{stats:"RUNNING"}}}).value
- 寫入安全(write concern)是一種客戶端設置,用於控制寫入的安全機制;分爲兩種:應答式寫入(數據庫會給出響應,告訴你是否寫入成功)和非應答式寫入(不知道是否寫入成功)。默認是應答式;
- shell對非應答式的支持與客戶端有區別:shell執行非應答式時會檢查最後一個操作是否成功;即便前面一系列的無效操作,最後一個操作是有效的,就不會報錯;
- 2012年之前,默認的寫入安全方式是非應答的;如何區分:新的都用的MongoClient類;舊的連接對象用的Mondo或者Connection或其他;