如何在 aerospike 中获取一条记录的主键(PK)?

How to get the primary key (PK) of a record in aerospike?

我想从 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 " } }

有什么建议吗?请帮忙。

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

那是因为默认不把主键和记录一起存储。 record 由元组 (namespace, set, PK) 标识,然后由客户端通过 RIPEMD-160 散列为 20 字节的摘要。该摘要是记录的实际标识符。这是客户端如何找到其分区 ID,查找哪些节点拥有该分区的主节点,并通过一跳转到该节点。

在该节点上,摘要是与主索引匹配以查找此记录的元数据的内容。扫描会将写入策略的 primary index for a particular namespace, get the metadata of all the records, and stream them back to the client. If you chose to have the sendKey 属性设置为 true,密钥将与记录的数据一起保存。然后你可以从 scan/query 得到它。默认情况下不会发生这种情况,因为这可能意味着很多 space

首先从 AQL 执行以下命令:

SET KEY_SEND TRUE

然后将数据插入特定的集合。

之后,执行select查询。

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