3

たとえば、Analytics で page_type、item_id、date、pageviews、timeOnPage を記録するとします。

回避する方法はいくつかあるようです。自動的な方法はありますか?

  1. たとえば、レコードを一意に識別するフィールドにインデックスを作成し、インデックスを一意にします [page_type, item_id, date]。これにより、同じレコードを追加すると拒否されます。

  2. または、DB またはフレームワークがサポートしている場合は、上記を一意のプライマリ インデックスにします。ただし、Rails では通常、ID 1、2、3、4 がプライマリ インデックスです。

  3. または、 を使用してレコードをクエリし、[page_type, item_id, date]そのレコードが既に存在する場合は更新します (または、pageviews と timeOnPage の値が既に同じ場合は何もしません)。レコードが存在しない場合は、このデータで新しいレコードを挿入します。しかし、この方法でレコードをクエリする必要がある場合は、とにかくこれら 3 つのフィールドにインデックスが必要なようです。

  4. 常に新しいレコードを挿入しますが、値を照会するときは、次のようなものを使用します

    select * from analytics  where ...  order by created_at desc limit 1
    

つまり、作成された最新のレコードを取得し、残りを無視します。select sum(pageviews)しかし、これは 1 レコードの解決策のように見えますが、やなどの値を合計する (集計を行う) 場合にはあまり実現可能ではありませんselect count(*)

上記の方法を使用する以外に、自動解決策もありますか?

4

2 に答える 2

4

ジャン、

あなたの最初の選択肢は私には実行可能に思えます。そして最も簡単な方法。Mongo はデフォルトでこの機能をサポートしています。

挿入時に一意の組み合わせをチェックし、存在する場合は挿入を無視し、サーバー ログに「E11000 重複キー エラー インデックス」メッセージを書き込みます。それ以外の場合は、通常の挿入が続行されます。

しかし、これは一括挿入の場合には機能しないようです。重複がある場合、バッチ全体が失敗します。クイック グーグルでは、既存の mongo バグ レポート jira ticketが表示されます。まだ開いています。

于 2010-09-15T04:17:37.967 に答える
1

Mongoid/MongoDB について話すことはできませんが、リレーショナル データベースで一意性制約を適用する場合は、一意性制約を作成する必要があります。それが彼らの目的です!MySQL では、これは一意のインデックスに相当します。として指定できますCONSTRAINT ... UNIQUE (col1, col2)、とにかく一意のインデックスが作成されます。

于 2010-09-15T02:51:42.227 に答える