面向文檔的數據庫
豐富的功能javascript
數據的基本單元,鍵值對的有序集
"_id"
,這個鍵在文檔中是惟一的\0
(空字符),這個符號用來表示鍵的結尾.
和$
有特殊含義,只能在特定狀況下使用一組文檔的集合,能夠看作有動態模式的表
集合使用命名進行標識,集合名能夠是如下任意UTF-8字符串
""
\0
,它表示集合名的結束stystem.
開頭,這是由於它是系統保留的前綴$
符號,由於系統生成的集合中包含$
使用.
分隔命名空間的子集合,用來高效、簡潔的組織數據java
MongoDB中,一個實例能夠承載多個數據庫,每一個數據庫能夠有零個或多個集合正則表達式
每一個數據庫擁有獨立權限,不一樣的數據庫存儲在不一樣的文件中mongodb
數據庫名區分大小寫,簡單起見,數據庫名所有小寫,其它與集合命名方式相似shell
MongoDB的保留數據庫名:數據庫
$ mongod --dbpath E:\mongodb\
終止 在shell中按下 Ctrl + Cjson
$ mongo
$ mongo host:30000/myDB
$ mongo --nodb
> db test
> show databases
> use user
> post = { "content":"here is my blog", "date":new Date() }
> post = { "content":"here is my blog", "date":new Date() } > db.blog.insert(post)
全部數組
> db.blog.find()
第一個安全
> db.blog.findOne()
> db.blog.update({"content":"here is my blog"},"here")
> db.blog.remove({"content":"here"})
數值bash
內嵌文檔
{"x":{"foo":"bar"}}
對象id
{"x":ObjectId()}
代碼
{"x":function(){}}
例如 db.blog[collection_name] db[db_name].find()
> db.foo.insertOne({"bar":"baz"})
這個操做會新建一個文檔,自動新增"_id"鍵,而後保存到MongoDB中
> db.foo.insert({"_id":1},{"_id":2},{"_id":3})
若是其中有一個文檔插入失敗,這個文檔及其以後的全部文檔失敗,以前的文檔依舊插入
> db.foo.remove({})
option中能夠傳入條件,符合條件的數據將會被刪除
> db.foo.drop()
刪除集合比刪除全部文檔的速度更快
一個常見的問題:
查詢條件匹配到了多個文檔而後更新於第二個參數的存在就產生重複的_id
值,數據庫會拋出異常,全部文檔都不會更新
正確的更新方法:
> db.people.update( { "_id" : ObjectId("4b3b9f67a1f631733d917a7c") } , joe )
$set
修改器設定一個鍵不存在就建立它,存在更新鍵對應的值,它還能夠改變值的類型
$inc
修改器增長已有鍵的值,鍵不存在就建立一個
必須是數字類型,不能增長其它類型的值,修改其它類型請使用$set
或者數值修改器
$unset
修改器刪除一個鍵使用它
數值修改器
$push
已有數組末尾加入一個元素,沒有就建立一個新數組$slice
的值必須是負數,它會限制數組最多有多少元素$addToSet
能夠避免重複插入值刪除數組中的元素
特定元素
> db.foo.insert({"arr":["a","b"]}) > db.foo.update({},{"$pull":{"arr":"a"}})
$each
批量更新數組
> db.foo.update({"_id":ObjectId("5bf7f5ab1fcca531779d012d")},{"$push":{"hourly":{"$each":[5,2,3,4]}}}
將文檔插入數據庫中時,依次插入的文檔在磁盤上的位置是相鄰的。
所以若是一個文檔變大了,原來的位置放不下這個文檔時,它會被移動到集合的另外一個位置。
當MongoDB不得不移動一個文檔時,它會建立一個,它會修改集合的填充因子(padding factor)
填充因子: MongoDB爲每一個新文檔預留的增加位置
查看填充因子
> db.coll.stats()
注意:
刪除、修改、增長都要使用$修改器,不然會將整個文檔替換,例子:
> db.people.update( criteria , { "foo" : "bar" } )
這會使整個文檔用{"foo":"bar"}替換
若是你的集合在進行插入和刪除時會進行大量的移動或者是常常打亂數據,能夠實用usePowerOf2Sizes選項提升磁盤複用率。
> db.runCommand({"collMod":collectionName,"usePowerOf2Sizes":true})
這個選項會致使以後全部的空間分配都是2的冪,使得空間分配再也不這麼高效。
若是沒有找到找到符合條件的文檔,就會以這個條件和更新文檔爲基礎新建一個新的文檔。若是找到了匹配的文檔,則正常更新。沒必要預置集合,同一個代碼既能夠建立文檔又能夠更新文檔。
> db.foo.update({ "url" : "/blog"}, {"$inc" : { "pageviews" : 1 }}, true)
update的第三個參數就是個upsert
建立文檔同時建立字段爲它賦值,以後全部的更新操做這個字段的值再也不改變。
> db.foo.update({}, {"$setOnInsert" : { "createdAt" : new Date() }}, true)
一般不須要保留createAt建立時間這樣的字段,由於ObjectId中包含了建立時的時間戳,可是在預置或者初始化計數器時或者不使用ObjectId的集合來講,$setOnInsert
是很是有用的
若文檔不存在建立,存在更新。它只有一個參數:文檔,若是包含_id
鍵,save會調用upsert,不然會調用insert。使用它能夠快速、方便的對文檔進行更新。
> var x = db.foo.findOne() > x.num = 42 > db.foo.save()
默認狀況下,文檔的更新只針對第一個匹配到的文檔,多個條件符合時,其它文檔不會改變。若想同時跟新多個文檔能夠將update的第四個參數設爲true
> db.users.update({"birthday":"10/13/1988"},{"$set":{"gift":"Happy Brithday!"}}, false , true)
這樣就給全部生日是1998年10月13的用戶添加了禮物gift
若是想得到跟新了多少文檔能夠運行getLastError命令
> db.runCommand(getLastError:1) { "err" : null, "updatedExisting" : true, "n" : 5, "ok" : true }
> db.runCommand("findAndModify ": "processes", "query" : {"status" : "READY"}, "sort":{"priority" : -1}, "update":{"$set" : "RUNNING"}) { "ok" : 1, "value" : { "_id" : ObjectId("4b3e7a18005cab32be6291f7"), "priority" : 1, "status" : "READY", } }
返回的文檔是更新前的值,但實際的文檔依舊更新
數據庫會給出響應,告訴你寫入操做是否成功執行
不返回任何響應,沒法得知寫入是否成功
手動強制shell中進行檢查,檢查最後一次操做中的錯誤
> db.getLastError()
[1] MongoDB權威指南