我想从航空突刺中获得特定记录。
但是当我执行以下查询时,我没有结果:
select * from ctl.prodCache where PK='111222';
但是当我执行以下查询时:
select * from ctl.prodCache;
它给了我所有记录,但根本不显示主键。
{ “ edigest”:“ BE6ZxLRMKwnbmUqPTvsmcIAgVv8 =”, “ set”:“ prodCache”, “ ttl”:54 “ gen”:1, “垃圾箱”:{ “ C”:“ java.util.ArrayList”, “ V”:“ 00 10 70 61 79 74 6D 6D 61 2E 64 6F 6D 61 69 6E 2E 43” } }
有什么建议吗?请帮忙。
答案 0 :(得分:3)
默认情况下,Aerospike不会存储您的主键。它存储密钥的RIPEMD160哈希+密钥类型+集合名称的1个字节。这就是您在base64中看到的edigest输出中的内容。在AQL中,您可以将SEND_KEY设置为true,然后它将显示在有关记录的元数据中。在AQL中,将SET RECORD_PRINT_METADATA设置为true,将SET OUTPUT JSON设置为更好的可见性。现在,如果您的键是字符串“ 111222”,则使用PK ='111222'的查询应该可以工作,如果它是整数,则使用PK = 111222即可。
答案 1 :(得分:2)
这是因为默认设置是不将主键与记录一起存储。 record由元组(namespace, set, PK)
标识,然后由客户端通过RIPEMD-160散列为20字节的摘要。该摘要是记录的实际标识符。客户端通过这种方式找到其分区ID,查找哪些节点拥有该分区的主节点,然后单跳转到该节点。
在该节点上,摘要是与主索引匹配以查找该记录的元数据的内容。扫描将遍历primary index到特定的名称空间,获取所有记录的元数据,并将它们流回客户端。如果您选择将写入策略的sendKey
属性设置为true,则密钥将与记录的数据一起保存。然后,您可以从扫描/查询中找到它。默认情况下不会发生这种情况,因为那可能意味着很多空间
答案 2 :(得分:0)
首先从AQL执行以下命令:
SET KEY_SEND TRUE
,然后将数据插入特定的集中。
然后,执行选择查询。
仅在将KEY_SEND设置为true的情况下完成插入的PK才会显示。