如何更新List列使用Mapper.UpdateAsync在Cassandra

本文关键字:Mapper UpdateAsync Cassandra string 何更新 更新 List | 更新日期: 2023-09-27 18:01:23

我是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中应该如何处理这种情况?

如何更新List<string>列使用Mapper.UpdateAsync在Cassandra

您可以使用加号(+)和减号(-)CQL操作符从列表中添加/预添加或删除项。

在你的例子中应该是:

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

注意,从本质上讲,追加和前置操作不是幂等的。因此,特别是,如果这些操作中的一个超时,那么重试操作是不安全的,它可能(也可能不)导致追加/前置值两次。

我认为为了使它工作和有效,您可能需要以下几点:

  • 部分更新

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

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

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

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