Aerospike - Check/Increment 列表中的 NIL 值?
Aerospike - Check/Increment for NIL value in a list?
如果我 运行 这段代码,它会增加索引 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 自动将 NIL 置于其位置。
如果我尝试增加索引 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 不是整数。所以,你不能增加它。
回答您的具体问题:
- 不,无法填充特定的默认值。
- 您可以在某个位置读取元素,您可以使用值 class 的 getType() 来了解元素是否为空类型。
您可以通过使用 LIST_WRITE_INSERT_BOUNDED
标志作为列表操作策略的一部分来避免更新此类列表。这种操作会抛出特定的错误代码 26。例如 (Python):
from __future__ import print_function
import aerospike
import sys
from aerospike_helpers.operations import list_operations as lh
config = {"hosts": [("127.0.0.1", 3000)]}
try:
client = aerospike.client(config).connect()
except e.ClientError:
print("Error: {0} [{1}]".format(e.msg, e.code))
sys.exit(1)
key = ("test", "example", "here")
try:
client.remove(key)
except:
pass
try:
ops = [
# increment the seventh element of a non-existent record with boundary
# restriction
lh.list_increment(
"incre", 7, 2, {"write_flags": aerospike.LIST_WRITE_INSERT_BOUNDED}
)
]
k, m, b = client.operate(key, ops)
except Exception as e:
print("Error: {0} [{1}]".format(e.msg, e.code))
print("Could not increment outside the boundary, in this case no record\n")
# try again, without limit on inserting into the bounds of the list
try:
ops = [
# increment the seventh element of a non-existent record
lh.list_increment(
"incre", 7, 2, {}
)
]
k, m, b = client.operate(key, ops)
(key, meta, bins) = client.get(key)
print(bins)
ops = [
# increment the sixth element of the newly created record
lh.list_increment(
"incre", 6, 1, {}
)
]
k, m, b = client.operate(key, ops)
except Exception as e:
print("Error: {0} [{1}]".format(e.msg, e.code))
print("Can't increment a None (NIL) value\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 客户端中,这是 ListWriteFlag.INSERT_BOUNDED
flag to the ListPolicy
。
但实际上,如果你有一个元组,其中第 0-6 位具有特定含义,你应该用 [0, 0, 0, 0, 0, 0, 0]
初始化 bin。
如果我 运行 这段代码,它会增加索引 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 自动将 NIL 置于其位置。 如果我尝试增加索引 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 不是整数。所以,你不能增加它。
回答您的具体问题:
- 不,无法填充特定的默认值。
- 您可以在某个位置读取元素,您可以使用值 class 的 getType() 来了解元素是否为空类型。
您可以通过使用 LIST_WRITE_INSERT_BOUNDED
标志作为列表操作策略的一部分来避免更新此类列表。这种操作会抛出特定的错误代码 26。例如 (Python):
from __future__ import print_function
import aerospike
import sys
from aerospike_helpers.operations import list_operations as lh
config = {"hosts": [("127.0.0.1", 3000)]}
try:
client = aerospike.client(config).connect()
except e.ClientError:
print("Error: {0} [{1}]".format(e.msg, e.code))
sys.exit(1)
key = ("test", "example", "here")
try:
client.remove(key)
except:
pass
try:
ops = [
# increment the seventh element of a non-existent record with boundary
# restriction
lh.list_increment(
"incre", 7, 2, {"write_flags": aerospike.LIST_WRITE_INSERT_BOUNDED}
)
]
k, m, b = client.operate(key, ops)
except Exception as e:
print("Error: {0} [{1}]".format(e.msg, e.code))
print("Could not increment outside the boundary, in this case no record\n")
# try again, without limit on inserting into the bounds of the list
try:
ops = [
# increment the seventh element of a non-existent record
lh.list_increment(
"incre", 7, 2, {}
)
]
k, m, b = client.operate(key, ops)
(key, meta, bins) = client.get(key)
print(bins)
ops = [
# increment the sixth element of the newly created record
lh.list_increment(
"incre", 6, 1, {}
)
]
k, m, b = client.operate(key, ops)
except Exception as e:
print("Error: {0} [{1}]".format(e.msg, e.code))
print("Can't increment a None (NIL) value\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 客户端中,这是 ListWriteFlag.INSERT_BOUNDED
flag to the ListPolicy
。
但实际上,如果你有一个元组,其中第 0-6 位具有特定含义,你应该用 [0, 0, 0, 0, 0, 0, 0]
初始化 bin。