MongoDB: The Definitive Guide
第一章 簡介
MongoDB是面向文檔的數據庫,不是關系型數據庫。內置對MapReduce的支持,以及對地理空間索引的支持。
- 豐富的數據模型
- 容易擴展,它所采用的面向文檔的數據模型可以使其在多臺服務器之間分割數據
- 豐富的功能,索引、存儲Javascript、聚合、固定集合、文件存儲
- 不犧牲速度,盡可能地將服務器端處理邏輯交給客戶端
- 簡便的管理,盡可能地讓服務器自動配置
?
第二章 入門
2.1 文檔
文檔是MongoDB的核心概念。
- MongoDB不但區分類型,也區分大小寫。
- 不能有重復的鍵。
- 文檔的鍵是字符串,不能含有‘\0’,這個字符用來表示鍵的結尾
- .和$有特別的意義,被保留
- 以下劃線_開頭的鍵是被保留的
2.2 集合
集合就是一組文檔。
- 在一個集合里用鍵標注類型,不如將不同類型分到不同的集合里,這樣查詢會快很多
- 把同種類型的文檔放到一個集合里,這樣數據會更加集中
- 索引是按照集合來定義的
命名:
推薦使用子集合來組織數據。以“.”分開的按命名空間劃分。
2.3 數據庫
多個集合組成數據庫。數據庫通過名字來標識:
- 不能是空字符串
- 不得含有’’、.、$、/、\、和\0
- 應全部小寫
- 最多64字節
保留數據庫:admin、local、config
2.4 啟動MongoDB
要啟動該服務,需要運行mongod可執行文件。
- 默認路徑/data/db(C:\data\db);端口27017
- 啟動HTTP服務器,監聽數字比主端口號高1000 。對于默認端口,就是28017,可訪問http://localhost:28017 來獲取數據庫管理信息。
2.5 MongoDB Shell
運行mongo啟動shell。(mongo [host/db: port])
- 功能完備的Javascript解釋器,可以充分利用Javascript標準庫,可以定義和調用Javascript函數,可以使用多行命令。
MongoDB客戶端,全局變量db,用use [db]命令切換數據庫
基本操作
db.help()可以查看數據庫級別的命令的幫助,集合的相關幫助可以通過db.foo.help()來查看。
函數名不寫括號,就會顯示該函數的Javascript源碼。
- 當有屬性和目標集合同名時(如version),db.version不能返回正確的collection,這時可以使用getCollection函數:db.getCollection(“version”)
- x.y和x[‘y’]完全等價,db.blog.posts也可以寫作db.blog[‘posts’]
2.6 數據類型
基本數據類型、數字、日期(new Date())、數組、內嵌文檔等。
- 盡量不要在Shell下覆蓋整個文檔(整數轉化為浮點數)
_id和ObjectId
- ObjectId是_id的默認類型,用12字節的存儲空間
- 秒級別的唯一性,大致會按照插入的順序排列,隱含了文檔創建的時間
- _id通常由客戶端驅動程序完成
?
第三章 創建、更新及刪除文檔
基本的插入刪除修改操作
db.foo.insert({"bar":"baz"}) db.users.remove() db.mailing.list.remove({"opt-out":true}) start = time.time() db.drop_collection("bar")joe.relationships={"friends":joe.friends,"enimies":joe.enimies}; delete joe.friends; delete joe.enimies; db.users.update({"name":"joe"}, joe)使用修改器$set, $inc, $ne, $push, $addToSet, $each
//添加或刪除鍵值 db.users.update({"name":"joe"}, {"$set":{"favorite book":"war and peace"}}) db.users.update({"name":"joe"}, {"$unset":{"favorite book":1}})//增減數值 db.games.update({"game":"pinball", "user":"joe"}, {"$inc":{"score":50}})//向數組添加值 db.papers.update({"authors cited":{"$ne":"Richie"}}, {"$push":{"authors cited":"Richie"}})//集合中增加值,避免重復 db.users.update({"_id":ObjectId("xxxx")},{"$addToSet":{"emails":"xxx@126.com"}}) db.users.update({"_id":ObjectId("xxxx")},{"$addToSet":{"emails":{"$each":["xxx@126.com", "xxx@hotmail.com"]}}})//集合中刪除值 db.lists.insert("todo":["dishes","laundry","dry cleaning"]) db.lists.update({},{"$pull":{"todo":1}}) //從數組末尾刪除 db.lists.update({},{"$pop":{"todo":-1}}) //從數組開頭刪除//數組定位 db.blog.update({"post":post_id},{"$inc":{"comments.0.votes":1}}) //用下標 db.blog.update({"comments.author":"John"},{"$set":{"comments.$.author":"Jim"}}) //只替換第一個同一套代碼既創建又更新文檔——upset
要是沒有文檔符合更新條件,就會以這個條件和更新文檔為基礎創建一個新的文檔。如果找到了匹配的文檔,則正常更新。
//update的第3個參數表示這個是upsert db.analytics.update({"url":"/blog"}, {"$inc":{"visits":1}}, true)save Shell幫助程序
save是一個Shell函數,可以在文檔不存在時插入,存在時更新。要是文檔含有_id鍵,save會調用upsert,否則會調用插入。
> var x = db.foo.findOne() > x.num = 42 42 > db.foo.save(x)更新多個文檔
//要使匹配到的文檔都得到更新,可以設置update的第4個參數為true > db.users.update({birthday:"10/13/1978"}, ... {$set:{gift:"Happy Birthday!"}}, false, true)//要知道更新了多少文檔 > db.runCommand({getLastError: 1})返回已更新的文檔
> ps = db.runCommand({"findAndModify":"processes", ... "query":{"status":"READY"}, ... "sort":{"priority":-1}, ... "update":{"$set":{"status":"RUNNING"}}).value > doSomething(ps) > db.processes.update({"_id":ps._id},{"$set":{"status":"DONE"}})數據庫會為每一個MongoDB數據庫連接創建一個隊列。
?
更多精彩內容,@https://www.mongodb.org/
轉載于:https://www.cnblogs.com/urwlcm/p/4625137.html
總結
以上是生活随笔為你收集整理的MongoDB: The Definitive Guide的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [翻译] Haneke(处理图片缓存问题
- 下一篇: json前后台传值