【问题标题】:Objectify - test if object exists using only the key?Objectify - 仅使用密钥测试对象是否存在?
【发布时间】:2016-03-02 21:20:02
【问题描述】:

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

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 次数据存储的读取操作。有没有办法不必加载整个对象,这可能更便宜?换句话说,一种只需要一次“小”操作的方法?

谢谢

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

    没有办法做到更便宜。

    即使您只执行仅键查询,查询也是 1 次读取操作 + 1 次获取的每个键的小型操作。 (https://cloud.google.com/appengine/pricing#costs-for-datastore-calls)

    继续按键获取,这只是 1 次读取。

    【讨论】:

    • 好吧,是的,应用引擎文档对我来说有点模棱两可,我尝试了@AndersonQ 的建议(这也是我解释他们文档的方式),但是读取仍然会增加。
    【解决方案2】:
    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 键()
    切换到仅键查询。仅键响应被称为“次要数据存储操作”,与获取整个实体相比,它更快且免费。

    【讨论】:

      【解决方案3】:

      您可以尝试获取密钥,据我了解,这只是一个小操作。

      // 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

      【讨论】:

      • 好的,我写了一个使用它的测试,不幸的是“数据存储读取操作”配额确实上升了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 2018-01-18
      相关资源
      最近更新 更多