繁体   English   中英

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

[英]Deleting or updating Datastore properties using Google Cloud Dataflow

如果要向现有实体添加属性,只需“克隆”并添加它。

  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>因为该方法返回UnmodifiableMap。

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

因此,这就是我在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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM