Migration 将记录迁移到Aerospike上的另一个集

Migration 将记录迁移到Aerospike上的另一个集,migration,record,aerospike,Migration,Record,Aerospike,当前设置: 我在Aerospike集群上运行一个名称空间。名称空间中几乎没有集合 我的用例: 我想将所有记录从一个集合(约100条记录)复制到同一命名空间下的另一个新集合(保持模式不变) 我的发现: 我做了一些深入研究,并使用aql找到了一些解决方案: 列出第一组中的所有记录,并将它们逐个插入新的记录集中。 优点:易于实施。 缺点:耗时且容易出现手动错误 使用asbackup/asrestore命令。 优点:它不受手动错误的影响。 缺点:它不允许在恢复期间更改集合的名称,我负担不起。确实提供了

当前设置:
我在Aerospike集群上运行一个名称空间。名称空间中几乎没有集合

我的用例:
我想将所有记录从一个集合(约100条记录)复制到同一命名空间下的另一个新集合(保持模式不变)


我的发现:
我做了一些深入研究,并使用aql找到了一些解决方案:

  • 列出第一组中的所有记录,并将它们逐个插入新的记录集中。
    优点:易于实施。
    缺点:耗时且容易出现手动错误
  • 使用
    asbackup/asrestore
    命令。
    优点:它不受手动错误的影响。
    缺点:它不允许在恢复期间更改集合的名称,我负担不起。确实提供了一些解决方法,但同样存在风险
  • 需要帮助:
    是否有任何有效的方法可以将数据从一个集合迁移到另一个集合,而不需要太多的工作和验证?我确实想过编写一些java代码来扫描整个集合,并将这些记录写入另一个集合,但这同样属于我前面解释的第一类


    谢谢

    Aerospike中的记录使用密钥和设置名称的散列存储。集合名称与该记录一起“存储”在Aerospike中,仅作为该记录上的元数据。因此,您可以扫描整个命名空间并返回属于该集合的记录,并且在扫描回调中,将每个记录作为新记录写回(由于集合名称不同)。您必须知道扫描返回的每条记录的“您的密钥”。默认情况下,Aerospike仅将20字节的哈希摘要存储为记录的键。因此,除非您使用send key true或bin将其显式存储在记录中,否则我看不出您将如何识别“您的密钥”。把“你的钥匙”放在箱子里是最容易的。您可能需要首先更新所有100条记录,并添加一个包含“您的密钥”的bin。然后在扫描回调中,记录没有特定的顺序,您将能够用“您的键”和“新集合名”组合一个新键。您必须为它编写自己的java代码。(如果您的原始记录中有“您的密钥”,那么很容易做到。)

    我还没有测试过这个。。但是,假设原始记录中有你的钥匙在“我的钥匙”箱中,那么沿着这些思路的一些东西就会起作用


    我相信你说的是WritePolicy下的
    sendKey
    标志。是的,我已经将其保留为true。如果您使用sendKey true,则可以从key对象检索密钥。我认为下面的代码可以工作,但是我还没有测试它:if(key.userKey!=null){Object userKey=key.userKey.getObject();根据您的建议检查。它可以工作,谢谢!。
    client.scanAll(null, "test", "set1", new ScanCallback(){
                    public void scanCallback (Key key, Record record) throws AerospikeException {   
    
                        String mykey = (String)(record.getValue("mykey"));
    
                        String bin1data = record.getString("bin1");  
                        //Alternate way to get string
    
                        Key reckey = new Key("test", "set2", mykey);
                        client.put(null, reckey, new Bin("bin1", bin1data));
                    }
    });