【问题标题】:How to get Datastore entity id from com.google.datastore.v1.Entity如何从 com.google.datastore.v1.Entity 获取数据存储实体 ID
【发布时间】:2019-05-07 13:35:35
【问题描述】:

我在我的 Google Cloud Dataflow 程序中编写了一个从 Google Datastore 获取数据的代码。我能够获取实体的所有字段,除了自动生成的字段 Id 字段。我曾尝试使用 entity.getKey(),但我得到了 null。

下面是我的代码sn-p,

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 获取所有字段。

【问题讨论】:

  • 在我花了 2 天的时间后,我的一位朋友想出了我的问题的解决方案,我可以通过以下代码解决它:entity.getKey().getPathList().get(0).getId()

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 你提供的链接是谷歌的核心api包方法,我使用的是com.google.datastore.V1,无法通过key.id()获取id。无论如何谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多