Java Aerospike-检查/增加列表中的零值?
如果我运行这段代码,它会增加索引7中存在的任何值,如果7之前的任何索引都不存在,它只会将NIL作为它的值 代码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
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不是整数。所以,你不能增加它 要回答您的具体问题:
通过使用
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 在列表操作策略中,可以使用边界列表写入标志防止插入超过当前列表值的边界