1. 程式人生 > >MongoDB進階

MongoDB進階

在mongo啟動後,切換到新的mongod:

conn = new Mongo(“127.0.0.1:27017”)
db = conn.getDB(‘test’)

mongo中的_id 和ObjectId

  ObjectId是”_id”的預設型別, ObjectId使用12位元組的儲存空間, 有24個16進位制的數字組成的字串
0 1 2 3 4 5 6 7 8 9 10 11
時間戳 機器 PID埠 計數器
前9個位元組保證了同一臺機器上不同機器不同程序產生的ObjectId是唯一的,最後3個是自動增加的計數器
一秒鐘允許每個程序擁有2563(16 777 216)個不同的ObjectId

在mongo中,如果不主動新增_id,會預設自動新增_id

db.help() 檢視資料庫級別的幫助

db.blog.help()檢視集合級別的幫助
db.blog.update 檢視函式的幫助

shell函式對應的javascript函式

use foo  db.getSisterDB("foo")
show dbs db.getMongo().getDBs()
show collections db.getCollectionNames()

插入

1. 批量插入
batchInset
db.foo.batchInsert([{"_id": 0}, {"_id": 1}, {"_id": 2}])

只有需要將多個文件插入到一個集合的時候, 這種方式才有用, 當前版本允許的最大的插入量為48MB, 多餘這個會拆分為多個48插入

db.foo.batchInsert([{"_id": 0}, {"_id": 1}, {"_id": 1}, {"_id": 2}])

當插入這個語句時, 執行到第三個文件就會報錯,前面的會成功插入,後面的就會失敗
可以使用continueOnError選項 將1,2,4插入,3會跳過,shell不支援,但是所有的驅動程式都支援

2. 插入效驗
  1. 如果沒有_id子段,會自動增加一個
  2. 檢查大小, 所有的文件都必須小於16MB, 檢視doc的BSON大小 在shell中執行 Object.bsonsize(doc)
  3. 檢查是否包含非UTF-8字串

刪除文件

1. 刪除的速度

db.foo.remove()

刪除集合中的文件,但不會刪除集合本身,也不會刪除集合的元資訊,可以指定刪除的引數

db.foo.drop()

清空整個集合, drop直接刪除集合速度更快

刪除是不可逆的,永久的

將文件插入到MongoDB中時,依次插入的文件在磁碟上的位置是相鄰的,如果文件變大了,原先的位置就放不下了,就會移動到集合的另外的位置

更新

優先使用 _id進行替換

修改器的使用

  1. $inc 用來專門增加或者減少數字的, 只適用於整形,長整型,雙精度浮點型的值, 它的值必須為數字
  2. $set
  3. $unset
  4. $push 會向已有的陣列末尾加入一個元素,沒有就建立一個新的陣列
  5. $each
  6. $slice
  7. $addToSet 去重如有相同的值會忽略
  8. $ne
  9. $pop 刪除元素
  10. $pull

修改器的速度

填充因子: 是MongoDB為每個新文件預留的增長空間
如果在進行插入和刪除時會大量的移動或者是經常打亂資料, 可以使用
userPowerOf2Sizes 提高磁碟複用率,通過collMod命令來設定
db.runCommand({“collMod”: collectionName, “usePowerOf2Sizes”: true})
分配所有的空間, 得到的塊大小是2的冪, 會導致初始空間分配不再高效
如果設定為false,會關閉這種特殊的分配機制,對已有的集合上執行這個命令不會對現有的資料產生影響

$upsert

為update的第三個引數, 是一種特殊的更新, 如果沒有找到更新條件的文件,就會以這個條件和更新文件為基礎建立一個新的文件,如果有就正常更新
db.users.update({“rep”: 25}, {“$inc”: {“rep”: 3}}, true)

$setOnInsert

在建立文件的同時建立欄位併為它賦值,在之後的操作中,不再改變
db.users.update({}, {“$setOnInsert”: {“createdAt”: new Date()}}, true)

save

save是一個shell函式,如果文件不存在,就自動建立,如果有的話就更新文件。要是這個文件有”_id”, save就呼叫upsert, 否則就呼叫insert

var x = db.foo.findOne()
x.num = 42
42
db.foo.save(x)

findAndModify

返回修改之前的文件

寫入安全機制

寫入安全是客戶端的設定,控制寫入的安全級別
1. 應答式寫入 寫入後資料庫會給出響應
2. 非應答式寫入 寫入後不會給出響應 根據最後執行的操作丟擲異常,如果前面的操作都是無效的,最後一個有效,shell不會丟擲異常
可以呼叫getLastError手動強制在shell中進行檢查

索引基數

集合中某個欄位擁有的不同值的數量, 比如age可以是男、女,這個基數就比較低。例如username每個文件都有不同的值,基數就很高
一個欄位的基數越高,在這個鍵上建立索引越有效

GridFs儲存檔案

GridFs是MongoDB中用來儲存大型二進位制檔案的一種儲存機制
如果有一些不經常改變但是經常需要連續訪問的大檔案,可以使用GridFS

GridFS的使用