代码之家  ›  专栏  ›  技术社区  ›  KayV

如何在aerospike中获取记录的主键?

  •  1
  • KayV  · 技术社区  · 6 年前

    我想从aerospike的一组中得到一个特定的记录。

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

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

    但当我执行以下查询时:

    select * from ctl.prodCache;
    

    “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” }

    有什么建议吗?请帮忙。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Key_coder    5 年前

    默认情况下,Aerospike不存储主键。它存储一个RIPEMD160散列值,该散列值为key type+set name加1字节。这就是你看到的 base64 在摘要输出中。在AQL中,可以设置 SEND_KEY true true 并设置输出JSON以获得更好的可见性。现在,你的问题 PK='111222' 如果你的钥匙是字符串的话,它应该能用 '111222' PK=111222 这应该管用。

        2
  •  2
  •   Ronen Botzer    6 年前

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

    在该节点上,摘要是与主索引匹配以查找此记录的元数据的内容。一次扫描可以让你走到 primary index sendKey 属性,则键将与记录的数据一起保存。然后您可以从scan/query获得它。默认情况下,这不会发生,因为这可能意味着很大的空间

        3
  •  0
  •   KayV    6 年前

    SET KEY_SEND TRUE
    

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

    然后,执行select查询。

    PK将仅显示插入操作已完成的插入,并将键\u SEND设置为true。