2016-08-08 33 views
0

我是一个新手,卡桑德拉和我当前的项目要求我创建一个表有以下栏目:如何在Cassandra中使用Mapper.UpdateAsync更新列表<string>?

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

我使用Cassandra的IMapper接口来处理我的CRUD操作。当我发现文档描述了如何使用基本操作这里的映射组件:

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); 

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

+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"); 

注意,追加和前置操作不受自然幂等。因此,特别是如果其中一个操作超时,则重试该操作并不安全,并且可能(或可能不)导致将值附加/预置两次。

0

我觉得为了这个工作,是有效的,你可能需要几件事情:

  • 部分更新

它是原子,并且不要求你先获取该记录。此外,仅指定要更新的字段可避免传递线路上不必要的负载,并减轻压缩机的压力。

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

,让你可以只指定要添加的藏品/删除。

这两种优化都可以通过Table API获得,不确定Mapper

相关问题