【问题标题】:Distinct projection query for ancestor/parent祖先/父母的不同投影查询
【发布时间】:2019-12-06 19:21:49
【问题描述】:

我有一个不断更新的“种类”,其中对象的父级是帐户。我想从此表中获取不同帐户的列表,其中每个帐户在过去 30 天内插入了最近的对象。

看来我不能对parent 或祖先使用投影查询。这基本上是我想要做的:

MyObject.query(default_options=QueryOptions(keys_only=True),projection=[MyObject.parent], 
                 distinct=True).filter(MyObject.creation_date>= start)

我最终遇到以下错误: AttributeError: type object 'MyObject' has no attribute 'parent'

有点预期,模型没有parentkey 有一个父级。

有没有办法做到这一点?我知道投影查询有点像SELECT 语句来获取对象的特定属性,但是,这不是 sql,因为谷歌可能想让它看起来像它。我不认为这是一个复杂的查询......

【问题讨论】:

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


    【解决方案1】:

    要过滤父项,一种方法是将父项显式存储在模型本身中。

    但即便如此,您尝试编写的查询也是 Datastore 不支持的聚合查询之一:

    SELECT DISTINCT parent FROM MyObject WHERE creation_date >= ...
    

    Datastore 确保查询随结果数量而不是实体数量而扩展,并且这里没有索引可以提供这种保证。

    1. 如果在parent, creation_date 上使用索引,Datastore 可能需要先检查大量parent,然后才能找到creation_date > start 所在的位置,这样才能随着种类中实体的数量而增加。
    2. 如果在creation_date, parent 上使用索引,Datastore 将需要跳过它已经看到的parent 的索引行,这也会随着类型中实体的数量而增加。

    这里没有灵丹妙药,但您可以单独进行聚合。一种方法是在模型上存储一个名为created_in_the_last_30_days 的字段,该字段最初设置为true。对于旧实体,您需要(每天?)后台作业将该字段从 true 翻转到 false,但是您可以将查询编写为:

    SELECT DISTINCT parent FROM MyObject WHERE created_in_the_last_30_days = true
    

    这会给你预期的结果,按parent排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多