如何使用Cassandra中的Mapper.UpdateAsync更新List <string>列?

时间:2016-08-08 14:48:06

标签: c# cassandra nosql

我是Cassandra的新手,我当前的项目要求我创建一个包含以下列的表:

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

我正在使用Cassandra的IMapper接口来处理我的CRUD操作。虽然我找到了描述如何在这里使用Mapping组件进行基本操作的文档:

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

我找不到文档,概述了如何使用Mapper组件为特定记录添加和删除List列中的项目。我尝试从数据库中检索记录,更新实体并将更改保存到记录中,但记录未在数据库中更新。更新后它保持不变。但是,插入操作有效,它将实体镜像到列表中的对象。

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

如何在Cassandra中处理这种情况?

2 个答案:

答案 0 :(得分:1)

您可以使用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 :(得分:0)

我认为为了使其发挥作用并保持高效,您可能需要以下几点:

  • 部分更新

它是原子的,并不要求您首先获取记录。此外,仅指定要更新的字段可避免在电线上传递不必要的负载,从而减轻压实机的压力。

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

允许您仅指定要添加/删除的集合项。

这两项优化均可通过Table API获取,不确定Mapper