更新Aerospike中单个字段的最佳方式

8zzbczxx  于 2022-10-31  发布在  Redis
关注(0)|答案(1)|浏览(194)

我有一个Aerospike缓存由一系列的数据与json值一样的结构。
示例值:{"name": "John", "count": 10}
我想扫描所有记录并将计数重置为零。处理此问题的好方法是什么?

wtzytmuj

wtzytmuj1#

我认为最好的方法是利用后台操作...我刚刚在Aerospike sandbox上尝试了以下代码,它确实将“report”Map中的所有“shape”条目更新为updated shape。(免责声明:我不是一个开发人员,所以一般来说,在Java中可能会有一些非常糟糕的方法,但这希望展示如何在Aerospike中进行后台操作扫描)
运行"设置“选项卡,然后将其复制粘贴到”创建“选项卡(或空白选项卡)中并运行:

import com.aerospike.client.task.ExecuteTask;
import com.aerospike.client.task.Task;
import com.aerospike.client.query.Statement;
import com.aerospike.client.query.Filter;
import com.aerospike.client.Operation;
import com.aerospike.client.exp.Exp;

AerospikeClient client = new AerospikeClient("127.0.0.1", 3000);

try {
    WritePolicy writePolicy = new WritePolicy();
    MapPolicy mapPolicy = new MapPolicy();
    String mapBinName = "report";
    String mapKeyName = "shape";

    Statement stmt = new Statement();
    stmt.setNamespace("sandbox");
    stmt.setSetName("ufodata");

    ExecuteTask task = client.execute(
      writePolicy, stmt, MapOperation.put(mapPolicy, mapBinName, 
                                          Value.get(mapKeyName), Value.get("updated shape")));

    if(task != null) {
        System.out.format("Task ID: %s\nTask Status: %s", 
            task.getTaskId(), task.queryStatus());    
    }
    else {
        System.out.format("Task seems null!");
    }
}

catch (AerospikeException ae) {
    System.out.format("Error: %s", ae.getMessage());
}

您可以将其更改为二级索引查询(如果已定义),或在Map框本身上添加更多过滤器...
以下几个教程可能会有所帮助:

相关问题