2016-09-06 4 views
0

現在のプロジェクトでいくつかの監査を適用したいと思います。そのためにシナリオを作成しましたが、ポイントを作る方法がわかりませんとアトミックです。MongoDB:ベリファイドキュメントが更新されていません

シナリオ

すべての文書は、バージョンとして、サーバ 意志timestampを持っている必要があります。我々は意志の文書を保存するとき:

  1. 文書が変更されていないことを確認 -は最初docUpdatedを保存するために、我々は希望の文書を最新の文書のtimestampsdocLatest を比較します。 timestampsは等しい必要があります。
    • 保存しないと保存要求が拒否されます。
    • OKの場合は、次のポイントに進みます。
  2. 更新
  3. は、以前のドキュメントでdiffを作成した文書 -最新のドキュメントは、私たちの最後の 文書でなければなりません。 diffを作成して保存します。

答えて

1

私はこのアイデアを一度偶然見つけます。私の考えはlong_polling技法を利用します。私はあなたのデータを設計する方法を教えていませんが、日付を数値に変換して比較することができます。 1と2の

、あなたは数に日付フォーマットを変換することができ、スキーマは以下のようになります。

var document= { 
    updatedAt: { type: Number, default: Date.parse(new Date()) } 
} 

その後、クライアントから提出されたすべての文書のために、ちょうどチェックし、

if(latestDocument.updatedAt - prevDocument.updatedAt > 0) { 
    //if latest's timestamp is bigger than prev, then store it in mongodb 

} else { 
    //if latest document is the same or even older, just ignore this document 
} 
場合

3番です。ドキュメントが変更されている場合は、それを比較する必要がありますか?私は、文書が文書全体を置き換えただけであれば、react/fluxの方法に従うことにしました。

+0

Thx vdj4y!私はそれを区別する必要があります。 diffログを監査ログに使用します。 私はmongoDbのより自然な解決策を踏襲しました。 http://mongoosejs.com/docs/guide.htmlを見て、 'option:versionKey'を検索してください。これは楽観的なロックの準備ができています。私の場合、 'timestamp'を単純な非負の数字である' __v'に置き換えます。しかし私は '__v'を私の文書のいずれにも見せてもらえません... – zatziky

+0

それはとても興味深いです。あなたが現在のドキュメントが最新であるかどうかをチェックしたいと思うので、私はそれが無意味だと思うから、古い値を最新のタイムスタンプに置き換えてください(インクリメントしないで置き換えてください)。計画はバージョンを増やすことです。乾杯 – vdj4y

関連する問題