【问题标题】:Why the query doesn't return results when the ancestor is not provided?为什么不提供祖先时查询不返回结果?
【发布时间】:2015-04-09 03:35:58
【问题描述】:

为什么没有指定祖先时过滤器不起作用?不管祖先,它不应该适用于实体类型吗?

我的用例:我使用父键设置了多个实体。该键与另一个实体(主实体)相对应,以便我可以通过祖先(主实体键)获取子项。

但是问题似乎是我无法再查询实体属性,除非我指定祖先。这是它应该工作的方式吗?下面是一些伪代码。如果问题不清楚,我可以提供工作代码。

type MyStruct{
  Unique int
}

 key1 := datastore.NewKey(c, "table1", "verylongstring", 0, nil)
 kparent :=  datastore.NewKey(c, "table1", "anotherlongstring", 0, key1)
 x := MyStruct{Unique:23}
 if _, err := datastore.Put(c, kparent, &x); err != nil {
        panic(err)
 }

// This works
 _, err := datastore.NewQuery("table1").Ascentor(kparent).Filter("Unique =", v.Unique).GetAll(cx, dst)

// Query with filter without ancestor doesn't work. Returns no results error.
 _, err := datastore.NewQuery("table1").Filter("Unique =", v.Unique).GetAll(cx, dst)

【问题讨论】:

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


    【解决方案1】:

    简答:

    与父对象一起保存的实体可以使用非祖先查询(您不使用Query.Ancestor() 方法指定祖先)进行查询。显然,过滤后的属性必须被索引。

    把东西放好:

    在您的示例中,与您的命名相反,key1 是父键,kparent 是您保存实体的键。

    当您使用 Query.Ancestor() 方法创建 Ancestor 查询时,ancestor filter 将结果限制为指定实体及其后代:因此您指定父键,结果将是具有此键的实体 (0或 1 个实体)以及这是父键的那些!

    在您的示例中,您会找到结果,因为实体的键正是您指定的键。通常祖先查询的使用方式是指定父键(而不是实体的键本身),在您的示例中为 key1

    需要注意的重要一点:祖先查询是高度一致的。这意味着如果您保存一个具有父级的实体并在此之后立即执行祖先查询(其中祖先过滤器与当然),您立即在查询结果中看到保存的实体。

    非祖先查询只是最终一致。这意味着如果您保存一个实体并在此之后立即执行非祖先查询,则查询不包括新保存的实体的可能性非常高,这很可能是您的情况。

    属性的索引只取决于属性的值,并且独立于实体的键,因此键是否有父级无关紧要。为新实体创建属性的索引条目后,按该属性过滤的查询将包括该实体。这可能需要短至几毫秒或“长”至几秒(不太可能)。

    请参阅此相关答案:How to filter a GAE query?,其中还解释了祖先键和查询。

    【讨论】:

    • 所以实际上我遇到的是缺乏一致性(由于第二个查询缺乏祖先)对吗?
    • 这绝对是问题所在。我添加了一些延迟,它似乎有效。
    • @Theuserwithnohat 是的。本地 SDK 模拟生产环境中的延迟。所以在你的测试代码中放一点延迟(睡眠),你会看到相同的结果。
    【解决方案2】:

    您正在比较两个不同的查询 - 祖先键不是唯一的区别。例如,如果过滤器属性没有被索引,第二个查询将不会返回任何结果。

    【讨论】:

    • 对不起。这实际上是一个错字。除了一个没有祖先之外,这两个查询都是相同的。 “唯一”字段已编入索引。
    猜你喜欢
    • 2012-04-23
    • 2023-03-03
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多