Java Aerospike-检查/增加列表中的零值?

Java Aerospike-检查/增加列表中的零值?,java,aerospike,Java,Aerospike,如果我运行这段代码,它会增加索引7中存在的任何值,如果7之前的任何索引都不存在,它只会将NIL作为它的值 代码 Operation operation = ListOperation.increment( "incre", 7 ); client.operate( policy, key, operation ); AQL aql> select * from test.users +----+----------------------------------------+ | PK

如果我运行这段代码,它会增加索引7中存在的任何值,如果7之前的任何索引都不存在,它只会将NIL作为它的值

代码

Operation operation = ListOperation.increment( "incre", 7 );
client.operate( policy, key, operation );
AQL

aql> select * from test.users
+----+----------------------------------------+
| PK | incre                                  |
+----+----------------------------------------+
| 2  | LIST('[1, 1, 1, 2, 1, 1, NIL, 1]') |
+----+----------------------------------------+
1 row in set (0.095 secs)

正如你所看到的,索引6并不存在,所以aerospike自动将零放在它的位置上。 如果我尝试增加索引6,我会得到这个错误

Exception in thread "main" com.aerospike.client.AerospikeException: Error 4,1,30000,0,0,BB955892AFD8CA0 127.0.0.1 3000: Parameter error
我的问题是:-

1) 对于不存在的索引,是否可以使用任何类型的默认值而不是NIL?如果无法检查NIL,是否可以增加NIL


2) 有没有办法在递增之前检查NIL值?

递增操作假定数据类型为整数。因此,当您尝试在位置7处递增时,并且那里还没有元素,它从整数0开始递增到1。然而,正如您所注意到的,第6个位置用NIL填充,因为列表需要连续。现在的问题是NIL不是整数。所以,你不能增加它

要回答您的具体问题:

  • 不可以,无法使用特定的默认值填充
  • 您可以在可以使用Value类的getType()来了解元素是否为null类型的位置读取该元素
    通过使用
    list\u WRITE\u INSERT\u BOUNDED
    标志作为列表操作策略的一部分,可以避免升级此类列表。这种操作会抛出一个特定的错误代码26。例如(Python):

    from\uuuuu future\uuuuu导入打印功能
    进口aerospike
    导入系统
    从aerospike_helpers.operations导入列表_操作作为lh
    配置={“主机”:[(“127.0.0.1”,3000)]]
    尝试:
    client=aerospike.client(config.connect())
    除e.ClientError外:
    打印(“错误:{0}[{1}]”。格式(e.msg,e.code))
    系统出口(1)
    键=(“测试”、“示例”、“此处”)
    尝试:
    客户端。删除(密钥)
    除:
    通过
    尝试:
    ops=[
    #用边界递增不存在记录的第七个元素
    #限制
    左侧列表\u增量(
    “增量”,7,2,{“写入标志”:aerospike.LIST_write_INSERT_BOUNDED}
    )
    ]
    k、 m,b=客户端操作(键,操作)
    例外情况除外,如e:
    打印(“错误:{0}[{1}]”。格式(e.msg,e.code))
    打印(“无法在边界外递增,在这种情况下没有记录\n”)
    #请重试,不限制插入列表的边界
    尝试:
    ops=[
    #递增不存在记录的第七个元素
    左侧列表\u增量(
    “增量”,7,2,{}
    )
    ]
    k、 m,b=客户端操作(键,操作)
    (key,meta,bins)=client.get(key)
    打印(箱子)
    ops=[
    #增加新创建记录的第六个元素
    左侧列表\u增量(
    “增量”,6,1,{}
    )
    ]
    k、 m,b=客户端操作(键,操作)
    例外情况除外,如e:
    打印(“错误:{0}[{1}]”。格式(e.msg,e.code))
    打印(“无法增加无(零)值\n”)
    client.close()
    
    哪个输出

    Error: 127.0.0.1:3000 AEROSPIKE_ERR_OP_NOT_APPLICABLE [26]
    Could not increment outside the boundary, in this case no record
    
    {'incre': [None, None, None, None, None, None, None, 2]}
    Error: 127.0.0.1:3000 AEROSPIKE_ERR_REQUEST_INVALID [4]
    Can't increment a None (NIL) value
    
    在Java客户机中,这是指向的标志


    但实际上,如果您有一个元组,其中第0-6位具有特定的含义,那么您应该使用
    [0,0,0,0,0,0]
    初始化bin

    在列表操作策略中,可以使用边界列表写入标志防止插入超过当前列表值的边界