使用 Google Cloud Dataflow 删除或更新数据存储区属性

Deleting or updating Datastore properties using Google Cloud Dataflow

如果您想将 属性 添加到现有实体,只需 "clone it" 并添加即可。

  Entity oldEntity = c.element();
  Entity.Builder entityBuilder = Entity.newBuilder(oldEntity);
  entityBuilder.addProperty(
          DatastoreHelper.makeProperty("newProperty",
                  DatastoreHelper.makeValue("Value")
          )
  );
  c.output(entityBuilder.build());

如果您想更新 属性,再次添加它希望覆盖旧值是行不通的。它不会保存到数据存储区,因为 属性 的名称必须是唯一的,现在您将有两个同名的名称。

Error writing to the Datastore (400): Entity has duplicate property name

如果要删除 属性,您需要知道 属性 列表中的索引,为此您需要列出所有属性,检查 属性你想更新存在,跟踪索引号,然后删除它。

此过程是否有内置帮助程序或我缺少的快捷方式?

目前 Google Cloud Dataflow 的 Java SDK 使用 Datastore API v1beta2 并且无法直接将 属性 添加到实体,甚至不使用 DatastoreHelper.getPropertyMap 并将属性添加到结果 Map<String, Value> 因为该方法 returns 一个 UnmodifiableMap.

当他们切换到 v1beta3 时,属性将仅作为地图公开,according 给团队成员。

这就是我在 v1beta2 上的管理方式:

Entity oldEntity = c.element();

// We need to get the property map, but the one from DatastoreHelper is an unmodifiableMap
Map<String, Value> oldEntity_map = DatastoreHelper.getPropertyMap(oldEntity);
Map<String, Value> newEntity_map = new HashMap<String, Value>();
newEntity_map.putAll(oldEntity_map);

// Adding or updating a property
newEntity_map.put("newProperty", DatastoreHelper.makeValue("Value").build());
// Deleting a property
newEntity_map.remove("delete-this");

Entity.Builder updatedEntity = Entity.newBuilder(oldEntity);
updatedEntity.clear();
updatedEntity.setKey(oldEntity.getKey());

for (Map.Entry<String, Value> property : newEntity_map.entrySet())
{
    updatedEntity.addProperty(
       DatastoreHelper.makeProperty(property.getKey(), property.getValue()));
}

c.output(updatedEntity.build());