如何从com.google.datastore.v1.Entity获取数据存储区实体ID

时间:2019-05-07 13:35:36

标签: java google-app-engine google-cloud-datastore google-cloud-dataflow apache-beam

我已经编写了代码从Google Cloud Dataflow程序中的Google Datastore中获取数据。我可以获取实体的所有字段,但Id字段除外,后者是自动生成的字段。我尝试使用entity.getKey(),但是我得到了空值。

下面是我的代码段,

Datastore datastore = DataflowDatastoreService.getDatastoreObject(null, null, null);
Query.Builder queryBuilder = Query.newBuilder();
Filter filter1 = Filter.newBuilder()
.setPropertyFilter(PropertyFilter.newBuilder()  .setProperty(PropertyReference.newBuilder().setName("cId"))
.setOp(PropertyFilter.Operator.EQUAL)
.setValue(Value.newBuilder().setIntegerValue(1059438885900008L).build()).build()).build();

Filter filter2 = Filter.newBuilder()
.setPropertyFilter(PropertyFilter.newBuilder()
.setProperty(PropertyReference.newBuilder().setName("active"))
.setOp(PropertyFilter.Operator.EQUAL)
.setValue(Value.newBuilder().setBooleanValue(Boolean.TRUE).build()).build()).build();

Filter composeFilter = Filter.newBuilder().setCompositeFilter(CompositeFilter.newBuilder()
                    .addFilters(filter1).setOp(Operator.AND).addFilters(filter2).build()).build();
            queryBuilder.addKind(KindExpression.newBuilder().setName("MyMaster").build());
            queryBuilder.setFilter(composeFilter).build();

RunQueryRequest request = DataflowDatastoreService.makeRequest(queryBuilder.build(), null);
RunQueryResponse response = datastore.runQuery(request);
QueryResultBatch batch = response.getBatch();
List<EntityResult> entityResutls =  batch.getEntityResultsList();
List<Entity> myEntities = new ArrayList<>();

Map<String, Value> entityMap = myEntities(0).getPropertiesMap();

在我的代码中,我能够获取entityMap密钥中的所有字段,但我没有得到密钥,是否还有其他方法可以通过Id获取所有字段。

1 个答案:

答案 0 :(得分:0)

注意:我不是Java用户,请根据python经验进行回答

实际上,在常规查询结果中返回的实体不包含实体键/ ID。尝试从实体中获取数据效率很低-您需要访问每个单独实体的数据存储区(甚至不必查看为什么这样做似乎对您不起作用)。

如果我需要实体密钥/ ID,我会使用keys-only queries-获取密钥,从中我可以轻松地获得:

  • 本地键ID,而不进行实际的数据存储调用(在Python中通过key.id(),我不知道Java等效项)
  • 通过直接键查找的实体,可以使用batched来提高效率。