2016-08-08 2 views
0

私はカサンドラに初心者と私は、次の列を持つテーブルを作成するために呼び出される私の現在のプロジェクト午前:私は私のCRUD操作を処理するためにカサンドラのIMapperインターフェイスを使用していますカッサンドラのMapper.UpdateAsyncを使用してリスト<string>列を更新するには?

id uuid PRIMARY KEY, 
connections list<text>, 
username text 

。私はここで基本的な操作のためのマッピングコンポーネントを使用する方法について説明しますドキュメント見つけながら:

http://docs.datastax.com/en/developer/csharp-driver/2.5/csharp-driver/reference/mapperComponent.html

を私はマッパーを使用して、特定のレコードのリスト欄から項目を追加および削除する方法について説明文書を見つけることができませんでした成分。エンティティを更新してレコードに変更を保存しましたが、データベース内のレコードは更新されませんでした。アップデート後も変わりません。ただし、挿入操作は機能し、エンティティをリスト内のオブジェクトに反映します。

User user = await _mapper.SingleAsync<T>("where Name = " + name); 
user.Addresses = user.Addresses.Concat(new string[] { address }); 
await _mapper.UpdateAsync<T>(user); 

カッサンドラでこのシナリオをどのように扱うべきですか?

+0

下記の@ user1790300の回答をどうやって取得しましたか? – halfer

答えて

0

plus (+) and minus (-) CQL operatorsを使用して、リストに項目を追加/削除したり、リストから項目を削除したりすることができます。あなたのケースでは

それは次のようになります。追加し、先頭に追加操作が自然で冪等されていない

// When using parameters, use query markers (?) instead of 
// hardcoded stringified values 
User user = await _mapper.SingleAsync<User>("where id = ?", id); 
await _mapper.UpdateAsync<T>(
    "SET connections = connections + ? WHERE id = ?", newConnections, id"); 

注意。特に、これらの操作の1つがタイムアウトした場合、操作を再試行することは安全ではなく、値を2回追加/追加することがあります。

0

私はこれが機能し、効率的にするためには、あなたがいくつかのことを必要とするかもしれないと思う:

  • 部分更新

それはアトミックで、最初のレコードを取得する必要はありません。また、更新するフィールドだけを指定すると、ワイヤに不必要な負荷がかからず、コンパクタの負担が軽減されます。あなたが削除/追加したいだけのコレクションアイテムを指定することができ

  • 使用CqlOperator.Append/CqlOperator.Prepend/CqlOperator.SubstractAssign

これらの最適化は両方ともTable APIで利用できますが、Mapperについてはわかりません。

関連する問題