1. 程式人生 > >【MongoDB】深入瞭解MongoDB不可不知的十點

【MongoDB】深入瞭解MongoDB不可不知的十點

一、物件ID的生成

每個mongoDB文件那個都要求有一個主鍵,它在每個集合中對所有的文件必須是唯一的,主鍵存放在文件_id欄位中。由12個字元組成;

4c291856       238d3b   19b2     000001  

4位元組時間戳   機器ID   程序ID  計數器3333

二、BSON

BSONmongodb中用來標示文件的二進位制格式,它既是儲存格式,也是命令格式。所有文件都以bson儲存在磁碟上,所有的查詢和命令都用bson文件來指定。

Db.users.find({_id:ObjectId(‘4c291856238d3b19b2000001’)})

Db.users.find({_id:‘4c291856238d3b19b2000001’})

以上兩種查詢的結果完全不同,其中只有一個能查詢到匹配_id欄位,這完全取決於users集合中的文件儲存的是BSON物件ID還是標示ID十六進位制的BSON字串。

三、聚合命令限制

 在實用性方面,distinct group有一個很大的限制,它們返回的結果集不能超過16M16M的限制並不是這些命令本身所強加的閥值,這是所有的初始查詢結果的大小。如果distinctgroup處理不了你的集合結果集,那麼就只能使用map-reduce代替了,它的結果可以儲存在集合中的非內聯返回。

四、原子文件處理

我們知道mongodb不善於處理事物,但要是使用者確實需要需要進行查詢和更新同時操作怎麼辦呢? 有一個工具你肯定不想錯過,那就是

mongodbfindAndModify命令。該命令允許對文件進行原子性更新,並在同一次呼叫中返回。

db.collections.findAndModify(

{

query:{},update:{},new:true or false 

}

)

預設情況下,findandmodify 命令會返回更新前的文件,要是返回修改後的文件,就把new設定為false. 

五、對陣列使用$unset

請注意在單個數組元素上使用$unset的結果可能與你設想的不一樣。其結果只是將元素的值設定為null,而非刪除整個元素。要想徹底刪除某個陣列元素,可以用$pull $pop操作符。

六、$addToSet
$push的區別

該兩者的功能都是給陣列新增一個值。但是兩者之間有區別,$addToSet要新增的值如果不存在才進行新增操作,但是push只新增一個值;例如:

  tags = [“tools”,”garden”]

如果執行db.collection.update({},{$push:{tag:tools}}) 結果就是 [“tools”,”garden”,“tools”]

如果執行db.collection.update({},{$addToSet:{tag:tools}}) 結果不變

七、稀疏索引建立

在稀疏索引中只會出現被索引鍵有值的文件,如果想建立稀疏索引,指定{sparse:true}就可以了。例如:

Db.product.ensureIndex({sku:1},{unique:true,sparse:true})

Sku可能存在為null的文件。

八、宣告索引時要小心

由於建立索引比較簡單,所以很容易在無意間建立索引,如果資料集很大的話,構建會花費很長的時間。並且沒辦法中種植。同時建立索引時候最好先排序這樣更加高效。 

九、用Explaintrue)詳細查詢執行計劃

使用者db.collection.find(condition).explain(true)

十、樂觀鎖

樂觀鎖就是併發控制,這項技術保證在無需鎖定記錄的情況下對器進行徹底更新。要理解它,最簡單的辦法就是想像一個wifi,有多個使用者可以同時編輯一個頁面。但你肯定不希望使用者編輯並更新一個過期的頁面,這是就可以使用樂觀鎖協議,當用戶試圖儲存他們更改的時候,會在更新操作中增加一個時間戳,如果該值比這個頁面最近儲存的版本舊,就不讓使用者更新。

這個在mongodb 執行$inc中用到