2012-08-27 60 views
1

我正在設計我的第一個MongoDB(和第一個NoSQL)數據庫,並且想要在集合中存儲關於文件的信息。作爲每個文件文件的一部分,我想存儲文件訪問的日誌(讀取和寫入)。使用MongoDB記錄文件訪問

我正在考慮創建日誌消息的陣列作爲文檔的一部分:

{ 
    "filename": "some_file_name", 
    "logs" : [ 
     { "timestamp": "2012-08-27 11:40:45", "user": "joe", "access": "read" }, 
     { "timestamp": "2012-08-27 11:41:01", "user": "mary", "access": "write" }, 
     { "timestamp": "2012-08-27 11:43:23", "user": "joe", "access": "read" } 
    ] 
} 

每個日誌消息將包含時間戳,訪問類型,以及訪問該文件的人的用戶名。我認爲這樣可以非常快速地訪問特定文件的日誌,這可能是日誌中最常用的操作。

我知道MongoDB的文檔大小限制爲16Mbyte。我想象那些經常訪問的文件可能會推動這個限制。

有沒有更好的方法來設計這種類型的日誌記錄的NoSQL架構?

+0

一個替代方案是單獨的集合'logs'(每個條目都有它引用的文件名)。 – Thilo

回答

2

讓我們先試着計算一個日誌記錄的平均大小的查詢:

時間戳字= 18 ,時間戳值= 8,用戶字= 8,用戶值= 20(10個字符是最大值(或肯定是avg)),訪問字= 12,訪問值爲10。所以你可以有~22萬條日誌記錄。

物理空間的一半將被字段名稱使用。如果您將名稱timestamp = t,user = u,access = a - 您將能夠存儲〜440000個日誌項目。

所以,我認爲這對大多數系統來說已經足夠了。在我的項目中,我總是試圖嵌入而不是創建單獨的集合,因爲它是通過mongodb實現良好性能的一種方式。

將來您可以將您的日誌記錄移動到單獨的集合中。此外,對於性能,您可以在文件文檔中擁有最後30個日誌記錄(簡單地將其非規範化),以便除日誌收集之外快速檢索。

此外,如果您將使用一個集合,請確保在不需要它們的情況下不加載日誌(可以在mongodb中包含/排除字段)。也使用$slice來做分頁。

還有一件事:享受mongo!

+1

我認爲這是相當糟糕的建議。嵌入式陣列不應該一直增長。這使得就地更新不可能,對於這些巨大的對象而言,不適當的更新尤其昂貴。一個76字節的附加可能會以多MB操作結束。 – Thilo

2

如果您認爲文檔限制會成爲問題,那麼只有少數選擇。

顯而易見的是爲每個日誌創建一個新文檔。

所以你將有一個collecton「日誌」。有了這個模式。

{ 
    "filename": "some_file_name", 
    "timestamp": "2012-08-27 11:40:45", 
    "user": "joe", 
    "access": "read" 
} 

找到哪些文件「喬」看了會有點像

db.logs.find({user: "joe", access: "read"})