使用Java实现同项目下Google Datastore不同Kind间的条目复制
实现方案
你需要基于查询到的Reserve类实体的属性,构建目标Active类的新实体再存入Datastore,核心逻辑是复用原实体的所有属性,仅替换Key对应的Kind即可,无需手动逐个读取属性赋值。
完整修改后代码
import com.google.cloud.datastore.Entity; import com.google.cloud.datastore.Key; import com.google.cloud.datastore.Query; import com.google.cloud.datastore.QueryResults; import com.google.cloud.datastore.Datastore; import com.google.cloud.datastore.DatastoreOptions; import java.util.ArrayList; import java.util.List; // 原有业务逻辑 if(dataList.contains("UpdateNeeded")) { Datastore datastore = DatastoreOptions.getDefaultInstance().getService(); // 如果你需要只复制满足指定条件的条目,可在这里给Query增加Filter过滤规则 Query<Entity> query = Query.newEntityQueryBuilder().setNamespace("userdata") .setKind("Reserve").build(); QueryResults<Entity> results = datastore.run(query); // 批量操作优化:数据量较大时攒批量提交,降低接口调用开销,Datastore单次批量提交最多支持500个实体 List<Entity> activeEntities = new ArrayList<>(); while (results.hasNext()) { Entity itr = results.next(); // 构建Active类的新Key,保留原Key的项目、命名空间、唯一标识(ID/名称),仅替换Kind为Active Key oldKey = itr.getKey(); Key newKey = Key.newBuilder(oldKey.getProjectId(), oldKey.getNamespace(), "Active", oldKey.getNameOrId()) .build(); // 直接复用原实体的所有属性构建新实体 Entity newActiveEntity = Entity.newBuilder(newKey, itr).build(); activeEntities.add(newActiveEntity); // 满500条批量提交一次 if(activeEntities.size() >= 500) { datastore.put(activeEntities.toArray(new Entity[0])); activeEntities.clear(); } } // 提交剩余不足500条的实体 if(!activeEntities.isEmpty()) { datastore.put(activeEntities.toArray(new Entity[0])); } }
注意事项
- 上述代码默认保留原实体的唯一标识(数字ID或自定义名称),如果不需要保留,希望Datastore为
Active类条目自动生成新ID,可以将newKey的构建逻辑修改为省略最后一位nameOrId参数即可,新的ID会在调用put后自动生成。 - 默认
put操作是覆盖写入,如果Active类下已存在相同Key的条目会被直接覆盖,如需避免覆盖可在写入前先调用datastore.get(newKey)判断是否存在,不存在再写入。 - 如果你需要在复制过程中修改、增减属性,可以在构建
newActiveEntity时通过set()、remove()方法操作对应属性即可。
内容的提问来源于stack exchange,提问作者Freddy
相关产品推荐
相关产品推荐

