Objectify - 仅使用密钥测试对象是否存在?

时间:2016-03-02 21:20:02

标签: google-app-engine objectify

我想测试数据存储区中是否存在对象。我知道它的关键。我现在通过加载整个对象来执行此操作:

public boolean doesObjectExist(String knownFooId) {

    Key<Foo> key = Key.create(Foo.class, knownFooId);

    Foo foo = ofy().load().key(key).now();
    if (foo != null) {
        // yes it exists.
        return true;
    }

    return false;
}

必须从数据存储中花费1次读取操作。有没有办法做到这一点,而不必加载整个对象,这可能会更便宜?换句话说,它只需花费1&#34;小&#34;操作

由于

3 个答案:

答案 0 :(得分:2)

没有办法做得更便宜。

即使你只进行一次密钥查询,查询也是1读取操作+每次获取一个键的小操作。 (https://cloud.google.com/appengine/pricing#costs-for-datastore-calls

继续按键获取,只需1次阅读。

答案 1 :(得分:0)

你可以尝试获取密钥,据我所知它只是一个小操作。

// You can query for just keys, which will return Key objects much more efficiently than fetching whole objects
Iterable<Key<F>> allKeys = ofy().load().type(Foo.class).filter("id", knownFooId).keys();

它应该工作。另请查看objectfy文档:https://github.com/objectify/objectify/wiki/Queries

答案 2 :(得分:0)

public boolean doesObjectExist(String knownFooId) {

    Key<Foo> fooKey = Key.create(Foo.class, knownFooId);    
    Key<Foo> datastoreKey = ofy().load().type(Foo.class).filterKey(fooKey).keys().first().now();

    return datastoreKey.equals(fooKey);

}   

来自documentation

  

QueryKeys keys()
  切换到仅键查询。纯键响应记为“较小的数据存储操作”,与获取整个实体相比,该操作更快且免费。