MongoDB基本使用

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或其他;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章