我是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中处理这种情况?
答案 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)
我认为为了使其发挥作用并保持高效,您可能需要以下几点:
它是原子的,并不要求您首先获取记录。此外,仅指定要更新的字段可避免在电线上传递不必要的负载,从而减轻压实机的压力。
允许您仅指定要添加/删除的集合项。
这两项优化均可通过Table
API获取,不确定Mapper
。