检查gae数据存储区中的重复项

时间:2014-09-26 05:00:44

标签: google-app-engine google-cloud-datastore

我正在为我输入的每个添加命令创建一个实体,但我想知道如何检查数据存储区中的重复项?

    Entity entity = new Entity("Animal");
    entity.setProperty("nameOfAnimal",name_of_animal);

我想检查一下,如果第二次输入的动物名称相同,我该如何检查重复的条目?

3 个答案:

答案 0 :(得分:1)

根据您要查找的行为,您有多种选择。

如果您使用nameOfAnimal作为实体名称,则可以在创建新实体之前尝试按键获取实体:

Key animalKey = KeyFactory.createKey("Animal", "fox");
Entity fox;
try {
    fox = datastoreService.get(animalKey);
    // no exception thrown so fox already exists
    throw new RuntimeException("Animal already exists!");
}
catch(EntityNotFoundException e) {
    // no duplicates, so can create
    fox = new Entity(animalKey);
    fox.setNoise("unknown");
    datastoreService.put(fox);
}

如果您没有使用nameOfAnimal作为键,则可以使用Query("Animal")代替get()(如 eluleci 的答案)。

无论哪种方式,要注意那里存在潜在的竞争条件。如果你想让它安全,你需要将它包装在transaction中,否则你可能会发现两个线程竞争创建第一个狐狸(例如),其中一个可能会覆盖另一个。

答案 1 :(得分:0)

您可以通过过滤" nameOfAnimal"来尝试获取实体。属性并检查返回的结果。如果结果为空,则表示还没有实体。

Filter propertyFilter =
  new FilterPredicate("nameOfAnimal", FilterOperator.EQUAL, name_of_animal);
Query q = new Query("Animal").setFilter(propertyFilter);
PreparedQuery pq = datastore.prepare(q);
List<Animal> resultList = pq.asList(FetchOptions.Builder.withLimit(1));
if(resultList.size() > 0) {
    // same name exists
} else {
    // first entitiy with this name
}

代码未经过测试,但这是主要想法。 Here is the documentation for property filters

答案 2 :(得分:0)

您可以将动物的名称用作实体的“id”,然后使用get by id检查此动物名称是否存在。