1. 程式人生 > >MongoDB固定集合的使用(基於Ruby)-記錄使用者日誌行為

MongoDB固定集合的使用(基於Ruby)-記錄使用者日誌行為

  在使用2.3.3版本的Ruby操作3.4版本的MongoDB中,如何通過Ruby在MongoDB中建立固定和使用集合,用於記錄使用者的日誌行為。

  MongoDB中的固定集合原本是針對高效能日誌場景設計的。它們與標準集合的區別在於其大小是固定的。也就是說,一旦固定集合到達容量上限,後續的插入會覆蓋集合中最先插入的文件。在只有最近的資料才有價值的情況下,這種設計免除了使用者手工清理集合的煩惱。

  以記錄站點使用者的行為,如檢視產品、新增購物車、結賬和購買。下面的指令碼用來模擬向固定集合記錄這些使用者行為的日誌功能。

require 'mongo'
VIEW_PRODUCT =0
ADD_TO_CART =1024
CHECKOUT =2
PURCHASE =3
con=Mongo::Client.new(['127.0.0.1:27017'],:database=>'test')
#刪除test資料庫
db=con.database
db.drop
#建立固定集合logInfo
logInfo=con[:logInfo,:capped=>true,:size=>1024]
logInfo.create
#迴圈向固定集合logInfo中插入文件
20.times do |n|
 doc={
 :username=>"Kbanker",
 :action_code=>rand(4),
 :time=>Time.now.utc,
 :n=>n}
 logInfo.insert_one(doc)
end
 

   該段ruby程式碼執行完畢後,在MongoDB Shell端首先執行shwo dbs,發現test資料庫已存在。使用use指令,use test進入test資料庫,執行show collections,查詢該資料庫下已有的集合。找到logInfo集合。此處可以驗證建立的是否是固定集合,執行db.logInfo.isCapped(),發現執行結果為true,則確認建立的集合為固定集合,結果如下;


  然後 執行db.logInfo.count(),執行結果如下圖。


   發現迴圈插入了20個文件,但集合中卻只有12個文件。為找到出現該種現象的原因。執行db.logInfo.find()指令,結果如下:


  發現集合中現有文件的n是從8-19。發現後面插入的文件覆蓋了原有的文件。這就是MongoDB中固定集合的使用方式。在固定集合的使用中,我們還需要注意固定集合和標準集合之間的幾個不同點。

  1. 固定集合預設不回位_id建立索引,這是為了優化效能,沒有索引,插入會更快。但是在3.4版本中,MongoDB預設為id建立了索引,通過db.logInfo.getIndexes()獲取當前集合的索引。結果如下圖所示。同樣MongoDB還提供了一個特殊的順序操作符,按自然插入順序(文件儲存在磁碟上的順序)返回集合的文件。之前的查詢是正向輸出結果;如果要逆向輸出,使用$natural排序操作符:

db.logInfo.find().sort({"$natural":-1})

倒序排列的執行結果如下:


  2. 除了按自然順序排列文件,並放棄索引(當前版本已增加了索引)。固定集合還限制了CRUD操作。比如:不能從固定集合中刪除文件,也不能執行任何會增加文件大小的更新操作。我們嘗試在固定集合上執行刪除操作

db.logInfo.remove({'n':'8'})
   執行結果如下圖,報錯資訊為:不能從固定集合中刪除文件資訊

db.logInfo.update({'n':8},{$set:{"username":"KbankerNew"}})

新名字的字元數大於了原名字的字元數,執行結果報錯


如大小相等呢?

db.logInfo.update({'n':8},{$set:{"username":"Kbanee"}})

大小相等,執行更新操作成功。

若小於呢?猜測是可以執行成功的:

db.logInfo.update({'n':8},{$set:{'username':'Kbank'}})

根據結果判斷,小於也是不能執行成功的。

到此,關於固定集合的使用方式和操作方法介紹結束。大家可以結合這個示例繼續深入開發。

  在MongoDB中,存在一類特殊的集合。MongoDB內部對集合的使用方式可以體現它的部分設計思想。system.namespaces與system.indexes就屬於這些特殊系統集合。前者用於查詢到當前資料庫中定義的所有名稱空間;後者儲存了當前資料庫的所有索引定義。