1

我想从 aerospike 中的一组中获取特定记录。

但是当我执行以下查询时,我没有得到任何结果:

select * from ctl.prodCache where PK='111222';

但是当我执行以下查询时:

select * from ctl.prodCache;

它给了我所有的记录,但根本不显示主键。

{“edigest”:“BE6ZxLRMKwnbmUqPTvsmcIAgVv8=”,“set”:“prodCache”,“ttl”:54,“gen”:1,“bins”:{“C”:“java.util.ArrayList”,“V” :“00 10 70 61 79 74 6D 6D 61 2E 64 6F 6D 61 69 6E 2E 43”}}

有什么建议么?请帮忙。

4

3 回答 3

3

默认情况下,Aerospike 不存储您的主键。它存储您的密钥的 RIPEMD160 哈希值 + 1 个字节的密钥类型 + 集合名称。这就是您base64在摘要输出中看到的内容。在 AQL 中,您可以设置SEND_KEY true,然后它将显示在有关记录的元数据中。在 AQL 中执行 SET RECORD_PRINT_METADATAtrue和 SET OUTPUT JSON 以获得更好的可见性。现在,PK='111222'如果您的键是一个字符串'111222',您的查询应该可以工作,如果它是一个整数,使用PK=111222它应该可以工作。

于 2018-10-09T16:23:26.987 回答
2

这是因为默认情况下不将主键与记录一起存储。记录由tuple 标识,(namespace, set, PK)然后由客户端通过 RIPEMD-160 散列为 20 字节摘要。该摘要是记录的实际标识符。这就是客户端如何找到它的分区 ID,查找哪些节点拥有该分区的主节点,然后一跳到达该节点。

在该节点上,摘要是与主索引匹配以查找此记录的元数据的内容。扫描将遍历特定命名空间的主索引,获取所有记录的元数据,并将它们流式传输回客户端。如果您选择将sendKey写入策略的属性设置为 true,则密钥将与记录的数据一起保存。然后你可以从扫描/查询中得到它。默认情况下这不会发生,因为这可能意味着很多空间

于 2018-10-09T16:37:30.140 回答
0

首先从 AQL 执行以下命令:

SET KEY_SEND TRUE

然后在特定集合中插入数据。

之后,执行选择查询。

PK 将仅针对已完成插入并将 KEY_SEND 设置为 true 的插入显示。

于 2018-11-13T09:08:03.520 回答