[英]403 error when attempting to access Google Cloud Datastore through 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.