如何从 com.google.datastore.v1.Entity 获取 Datastore 实体 ID

How to get Datastore entity id from com.google.datastore.v1.Entity

我已经在我的 Google Cloud Dataflow 程序中编写了一个代码来从 Google 数据存储中获取数据。我能够获取实体的所有字段,除了自动生成的字段 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 获取所有字段。

注意:我不是 java 用户,根据 python 经验回答

确实,在常规查询结果中返回的实体不包含实体key/ID。尝试从实体中获取它是相当低效的——您需要访问每个单独实体的数据存储(甚至不考虑为什么它似乎对您不起作用)。

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

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