2017-07-03 5 views
0

の要素を更新することができ、私は私が行う必要がどのようなオブジェクトBMongoDBのC# - どのように私は、アレイ

とMongoのテーブルを持っているのは、このような構造に

class A 
{ 
    string Id; 
    int value 
    ... 
} 

class B 
{ 
    int sum; 
    List<A> L; 
    some stuff 
} 

を想定してみましょう擬似コードで次のようになります。

if (any A item of B has Id == XXX) 
{ 
    if (A.value > X) 
    { 
    B.Sum += A.Value; 
    A.Value = 0; 
    } 
} 

を1回(原子的に)操作します。 012.sys + = A.ValueとA.Value = 0は、アトミックである必要があります。

私はそれをどのように実装するかという手がかりは全く持っていません。

誰もMongoDBと似たようなことをしましたか?

答えて

0

あなたが知っている限り、Mongoはトランザクションを持っていません。 しかし、あなたの場合、私はnoSqlのアプローチを使用すると回避するのは簡単だと思います。あなたはそのAオブジェクトが配列内で含まれているBオブジェクトの単一のテーブルを持っている必要があるすべて:

Bオブジェクト { sum: 0, listA: [ {id: A1, value: 1}, {id: A2, value:2 }], some stuff }

次にあなたがオブジェクトに対してクエリを実行します。 db.B.find({"listA.id":"XXX"})

あなたはBオブジェクトの計算を行い、1つのBレコードのみを更新する必要があります - それは原子です

これはここでよりよく説明されますHow to work around the lack of transactions in MongoDB?

+0

ですから、本質的に2回ですか? 1つはリストにオブジェクトを挿入し、もう1つは時間を更新するか? – Thomas

+0

現在、Aオブジェクトはどこに保管していますか? – Mihaela