1

2 つの MongoDB コレクションがあります

プロモーション コレクション:

{
    "_id" : ObjectId("5115bedc195dcf55d8740f1e"),
    "curr" : "USD",
    "desc" : "durable bags.",
    "endDt" : "2012-08-29T16:04:34-04:00",
     origPrice" : 1050.99,
    "qtTotal" : 50,
    "qtClaimd" : 30,
}

主張されたコレクション:

{
    "_id" : ObjectId("5117c749195d62a666171968"),
    "proId" : ObjectId("5115bedc195dcf55d8740f1e"),
    "claimT" : ISODate("2013-02-10T16:14:01.921Z")

}

誰かがプロモーションを要求すると、「claimedPro」コレクション内に新しいドキュメントが作成されます。ここで、proId は最初の (プロモーション) コレクションへの (仮想) 外部キーです。すべてのクレームは、「promo」コレクションのカウンター「qtClaimd」をインクリメントする必要があります。トランザクション方式で別のコレクションの値をインクリメントする最良の方法は何ですか? MongoDB には複数のドキュメントの分離がないことを理解しています。

また、「非埋め込み」アプローチを採用した理由は次のとおりです。

プロモーションが作成されてユーザーに公開された後、数十万の請求が発生します。単一のドキュメントで多数の書き込みが発生することを考えると、promo コレクション内にクレームを埋め込むことは論理的ではないと思いました ('coz mongo は、数千のクレームのためにサイズが大きくなると、promo コレクションのサイズを変更します)。埋め込みアプローチを使用しないと、プロモーション コレクションは影響を受けずに保持されますが、「クレーム」コレクションに新しいドキュメントが挿入されます。後でレポートを生成するときに、そのプロモーションの「クレーム」の詳細とともに「プロモーション」の詳細を表示する必要があります。非埋め込みアプローチでは、最初に「promo」コレクションをクエリし、次に「proId」で「クレーム」コレクションをクエリする必要があります。*何百もの「クレーム」が発生する場合があることにも注意してください。

これら 2 つのコレクションでトランザクション効果を達成するための最良の方法は何ですか? 私はScala、Casbah、およびSalatをすべてScala 2.10バージョンで使用しています。

4

1 に答える 1

1
db.bar.update({ id: 1 }, { $inc: { 'some.counter': 1 } });

これを SalatDAO で実行する方法を見てください。私はプレイ ユーザーではないので、間違ったアドバイスはしたくありません。$incインクリメントするMongoの方法です。

于 2013-02-14T02:35:10.833 に答える