1

最初のMongoDB(および最初のNoSQL)データベースを設計していて、ファイルに関する情報をコレクションに保存したいと考えています。各ファイルドキュメントの一部として、ファイルアクセス(読み取りと書き込みの両方)のログを保存したいと思います。

ドキュメントの一部としてログメッセージの配列を作成することを検討していました。

{
    "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には16Mバイトのドキュメントサイズ制限があることを知っています。非常に頻繁にアクセスされるファイルは、この制限を超える可能性があると思います。

このタイプのロギング用にNoSQLスキーマを設計するためのより良い方法はありますか?

4

2 に答える 2

2

最初に、1 つのログ レコードの平均サイズを計算してみましょう。

タイムスタンプ ワード = 18、タイムスタンプ値 = 8、ユーザー ワード = 8、ユーザー値 = 20 (最大 (または確かに平均) である 10 文字)、アクセス ワード = 12、アクセス値 10。したがって、合計は 76 バイトです。したがって、最大 220000 のログ レコードを持つことができます。

また、物理スペースの半分がフィールド名によって使用されます。タイムスタンプ = t、ユーザー = u、アクセス = a という名前を付ける場合、最大 440000 のログ項目を保存できます。

したがって、ほとんどのシステムで十分だと思います。私のプロジェクトでは、個別のコレクションを作成するのではなく、常に埋め込みを試みています。これは、mongodb で優れたパフォーマンスを実現する方法だからです。

将来的には、ログ レコードを別のコレクションに移動できます。また、パフォーマンスのために、ログの収集に加えて高速に取得するために、ファイル ドキュメントに 30 個の最後のログ レコード (単純に非正規化) を含めることができます。

また、1 つのコレクションを使用する場合は、必要のないときにログをロードしないようにしてください (mongodb のフィールドを含めたり除外したりできます)。$sliceページングにも使用します。

最後に mongo をお楽しみください。

于 2012-08-27T12:09:44.377 に答える
2

ドキュメントの制限が問題になると思われる場合は、いくつかの選択肢があります。

明らかな方法は、ログごとに新しいドキュメントを単純に作成することです。

したがって、コレクション「ログ」が作成されます。このスキーマで。

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

"joe" が読み取ったファイルを検索するクエリは、次のようなものになります。

db.logs.find({user: "joe", access: "read"})
于 2012-08-27T12:00:18.577 に答える