【问题标题】:How many entities I pay when I use objectify first() method in datastore queries当我在数据存储查询中使用 objectify first() 方法时,我支付了多少实体
【发布时间】:2016-05-25 16:52:07
【问题描述】:

我知道,对于任何查询,Datastore 定价配额都基于检索到的实体数量。现在,如果我使用 objectify 编写这样的查询或类似的查询:

Car car = ofy().load().type(Car.class).filter("vin >", "123456789").first().now();

我是为查询选择的 vin > 123456789 的任何实体付费还是只为我实际检索的第一个实体付费?

【问题讨论】:

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


    【解决方案1】:

    关于索引的数据存储文档是这样说的:

    1. 标识与查询的种类、过滤器对应的索引 属性、过滤器运算符和排序顺序。
    2. 从索引的开头扫描到第一个符合条件的实体 查询的所有过滤条件。
    3. 继续扫描索引,依次返回每个实体,直到 它
      • 遇到不符合过滤条件的实体,或
      • 到达索引的末尾,或
      • 已收集查询请求的最大结果数。

    (来源documentation

    由于查询请求的最大结果数为 1,因此您只有一次读取的索引扫描,您需要为此付费。

    注意索引是有序的,因此这将是一个非常短的索引扫描和一个非常小的操作。

    另一方面,您没有在查询中指定顺序。因此,从技术上讲,结果可以是任何符合您查询条件的实体。通常你会想要最大或最小的值或限定范围内的任何值。由于索引是有序的,因此您应该根据索引顺序(升序或降序)获取索引中的第一个实体。

    【讨论】:

    • 但是,如果索引是有序的,扫描第一个不会遇到过滤栏上方的第一个实体?如果不是这样,我如何进一步指定查询过滤器以这种方式运行?
    • 我相信你必须添加一个.order("-vin")。问题是这是否需要额外的索引。
    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多