_id字段
5a604e62 efe04a 6f4f a985e1
4字節(jié)時(shí)間戳 機(jī)器ID 進(jìn)程ID 計(jì)數(shù)器
bson
bson是mongodb中用來(lái)標(biāo)示文檔的二進(jìn)制格式,它既是存儲(chǔ)格式,也是命令格式。所有文檔都以bson存儲(chǔ)在磁盤(pán)上,所有的查詢和命令都用bson文檔來(lái)指定。
聚合命令限制
distinct 和group,它們返回的結(jié)果集不能超過(guò)16M。16M的限制并不是這些命令本身所強(qiáng)加的閥值,這是所有的初始查詢結(jié)果的大小。如果distinct和group處理不了你的集合結(jié)果集,那么就只能使用map-reduce代替了,它的結(jié)果可以保存在集合中的非內(nèi)聯(lián)返回。
原子文檔處理
我們知道m(xù)ongodb不善于處理事物,但要是用戶確實(shí)需要需要進(jìn)行查詢和更新同時(shí)操作怎么辦呢? 有一個(gè)工具你肯定不想錯(cuò)過(guò),那就是mongodb的findAndModify命令。該命令允許對(duì)文檔進(jìn)行原子性更新,并在同一次調(diào)用中返回。
對(duì)數(shù)組使用$unset
請(qǐng)注意在單個(gè)數(shù)組元素上使用$unset的結(jié)果可能與你設(shè)想的不一樣。其結(jié)果只是將元素的值設(shè)置為null,而非刪除整個(gè)元素。要想徹底刪除某個(gè)數(shù)組元素,可以用$pull 和$pop操作符。
$addToSet和$push的區(qū)別
該兩者的功能都是給數(shù)組添加一個(gè)值。但是兩者之間有區(qū)別,$addToSet要添加的值如果不存在才進(jìn)行添加操作,但是push只添加一個(gè)值;例如:
tags = [“tools”,”garden”]
如果執(zhí)行db.collection.update({},{$push:{tag:tools}}) 結(jié)果就是 [“tools”,”garden”,“tools”]
如果執(zhí)行db.collection.update({},{$addToSet:{tag:tools}}) 結(jié)果不變
稀疏索引創(chuàng)建
在稀疏索引中只會(huì)出現(xiàn)被索引鍵有值的文檔,如果想創(chuàng)建稀疏索引,指定{sparse:true}就可以了。例如:
Db.product.ensureIndex({sku:1},{unique:true,sparse:true})
Sku可能存在為null的文檔。
聲明索引時(shí)要小心
由于創(chuàng)建索引比較簡(jiǎn)單,所以很容易在無(wú)意間創(chuàng)建索引,如果數(shù)據(jù)集很大的話,構(gòu)建會(huì)花費(fèi)很長(zhǎng)的時(shí)間。并且沒(méi)辦法中種植。同時(shí)創(chuàng)建索引時(shí)候最好先排序這樣更加高效。
用Explain(true)詳細(xì)查詢執(zhí)行計(jì)劃
用戶db.collection.find(condition).explain(true)
樂(lè)觀鎖
樂(lè)觀鎖就是并發(fā)控制,這項(xiàng)技術(shù)保證在無(wú)需鎖定記錄的情況下對(duì)器進(jìn)行徹底更新。要理解它,最簡(jiǎn)單的辦法就是想像一個(gè)wifi,有多個(gè)用戶可以同時(shí)編輯一個(gè)頁(yè)面。但你肯定不希望用戶編輯并更新一個(gè)過(guò)期的頁(yè)面,這是就可以使用樂(lè)觀鎖協(xié)議,當(dāng)用戶試圖保存他們更改的時(shí)候,會(huì)在更新操作中增加一個(gè)時(shí)間戳,如果該值比這個(gè)頁(yè)面最近保存的版本舊,就不讓用戶更新。
這個(gè)在mongodb 執(zhí)行$inc中用到