C# 如何更新列表<;字符串>;在Cassandra中使用Mapper.UpdateAsync的列?

C# 如何更新列表<;字符串>;在Cassandra中使用Mapper.UpdateAsync的列?,c#,cassandra,nosql,C#,Cassandra,Nosql,我是Cassandra的新手,我当前的项目要求我创建一个包含以下列的表: id uuid PRIMARY KEY, connections list<text>, username text id uuid主键, 连接列表, 用户名文本 我正在使用Cassandra的IMapper接口来处理CRUD操作。我在这里找到了描述如何使用映射组件进行基本操作的文档: 我找不到概述如何使用Mapper组件从特定记录的列表列中添加和删除项的文档。我试图从数据库中检索记录,更新实体并保存对记

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

id uuid PRIMARY KEY,
connections list<text>,
username text
id uuid主键,
连接列表,
用户名文本
我正在使用Cassandra的IMapper接口来处理CRUD操作。我在这里找到了描述如何使用映射组件进行基本操作的文档:

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

User user = await _mapper.SingleAsync<T>("where Name = " + name);
user.Addresses = user.Addresses.Concat(new string[] { address });
await _mapper.UpdateAsync<T>(user);
User User=wait\u mapper.SingleAsync(“where Name=“+Name”);
user.Addresses=user.Addresses.Concat(新字符串[]{address});
wait_mapper.UpdateAsync(用户);
在Cassandra中应该如何处理这种情况?

您可以使用添加/前置或从列表中删除项目

在您的情况下,它将是:

// 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");
//使用参数时,请使用查询标记(?)而不是
//硬编码字符串化值
User User=wait_mapper.SingleAsync(“其中id=?”,id);
wait\u mapper.UpdateAsync(
“设置连接数=连接数+?其中id=?”,newConnections,id”);

请注意,追加和预结束操作本质上不是幂等的。因此,特别是,如果其中一个操作超时,则重试该操作是不安全的,并且可能(或可能不)导致将该值追加/预结束两次。

我认为,要使其有效运行,您可能需要以下几点:

  • 部分更新
它是原子的,不需要您首先获取记录。此外,仅指定要更新的字段可以避免在线路上传递不必要的负载,并减轻压缩程序的压力

  • 使用ckloperator.Append/ckloperator.Prepend/ckloperator.SubstractAssign
允许您仅指定要添加/删除的集合项


这两种优化都可以通过
API获得,但不确定
映射器

下面提供的答案@user1790300是如何得到的?