0

私はMongoを初めて使用します。複数の基準に基づいてドキュメントをアトミックにアップサートしたかったのです。ドキュメントは次のようになります。

 {_id:..., hourOfTime:..., total:..., max:..., min:..., last:...}

これは基本的に、で識別されるアイテムのクリック数の1時間ごとの集計です_id。各アイテムのクリックは、5秒ごとにアプリケーションからMongoDBにフラッシュされます。したがって、ドキュメントは5秒ごとに更新する必要があります。

これがその場合です。で言うとt=t0{_id:"nike", total:123, max:10, min:3, last:9}それでは、でt=t1、メッセージが表示されます{_id:"nike", count: 12}。さて、のため_id="nike"に、私は次のことをする必要があります、

  1. インクリメントtotal_12
  2. の場合max < 12、更新max=12
  3. の場合min > 12、更新min=12
  4. アップデートlast=12

このすべての操作をアトミックにしたい。これを1つのクエリで変換できません。ヘルプ/ヒントをいただければ幸いです。

4

1 に答える 1

1

これは、単一のクエリでは実行できません。これが私がそれをする方法です:

  1. ドキュメントに。というフィールドがありますlocked。フィールドがfalseの場合は、を実行しfindAndModifyてドキュメントを取得し、ロックされたフィールドをロックされているフィールドに設定します。これにより、他のアプリケーションインスタンスがフィールドをチェックすることを条件に、ドキュメントを変更できなくなります。lockedDate()locked
  2. ドキュメントアプリケーション側を変更してから、 lockedfalseに設定してアトミックに更新します。findAndModifyドキュメントを変更するものがフィールドで実行される限りlocked、この変更全体はアトミックである必要があります。

マシンが爆発した場合にドキュメントが無期限にロックされないように、ロックがタイムアウトするしきい値を設定してください。つまり、ドキュメントを2回更新するとき(およびロックを解除するとき)、アプリケーションは、ドキュメント内の日付が期待どおりであることを確認して、まだロックされていることを確認する必要があります。

于 2013-03-25T17:18:42.977 に答える