Google app engine 如何过滤GAE查询?

Google app engine 如何过滤GAE查询?,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,我正试图保存两条记录,然后得到第二条。问题是过滤器似乎不起作用。虽然我按名字安德鲁W过滤,但我总是得到乔公民。计数器还指示2条记录,而该记录应仅为一条。这让我发疯。请参阅下面的完整代码。 结果打印计数器2 e2{Joe Citizen Manager 2015-03-24 09:08:58.363929+0000 UTC} 第一个问题是: q := datastore.NewQuery("employee") q.Filter("Name =", "Andrew W") 返回包含指定筛选器的

我正试图保存两条记录,然后得到第二条。问题是过滤器似乎不起作用。虽然我按名字安德鲁W过滤,但我总是得到乔公民。计数器还指示2条记录,而该记录应仅为一条。这让我发疯。请参阅下面的完整代码。 结果打印计数器2 e2{Joe Citizen Manager 2015-03-24 09:08:58.363929+0000 UTC}


第一个问题是:

q :=  datastore.NewQuery("employee")
q.Filter("Name =", "Andrew W")
返回包含指定筛选器的派生查询。您必须存储返回值并持续使用它:

q := datastore.NewQuery("employee")
q = q.Filter("Name =", "Andrew W")
或者只有一行:

q := datastore.NewQuery("employee").Filter("Name =", "Andrew W")
注意:如果没有这个选项,您执行的查询将没有过滤器,因此将返回所有以前保存的员工类型的实体,其中Joe Citizen可能是您看到打印的第一个实体

对于第一次运行,您很可能会看到0个结果。注意,由于您不使用祖先查询,因此最终的一致性适用。开发SDK模拟高复制数据存储及其最终一致性,因此Put操作后的查询将看不到结果

如果在继续查询之前花一点时间。Sleep,您将看到预期的结果:

time.Sleep(time.Second)

var e2 Employee
q := datastore.NewQuery("employee").Filter("Name=", "Andrew W")
// Rest of your code...
还请注意,在SDK中运行代码可以通过如下方式创建上下文来模拟强一致性:

c, err := aetest.NewContext(&aetest.Options{StronglyConsistentDatastore: true})
但当然,这只是为了测试的目的,你不能在生产中这样做

如果希望结果具有强一致性,请在创建密钥时指定祖先密钥,然后使用。仅当您希望得到高度一致的结果时,才需要祖先密钥。如果您对结果显示的几秒钟延迟感到满意,那么您不必这样做。还要注意的是,祖先键不必是现有实体的键,它只是语义。您可以创建任何虚构的密钥。对多个实体使用相同的虚拟密钥将把它们放在同一个实体组中,对该组的祖先查询将非常一致


通常,祖先密钥是一个现有密钥,通常来自当前用户或帐户,因为它可以轻松创建/计算,并保存/存储一些附加信息,但如上所述,它不必如此。

几乎可以肯定,因为最终的一致性。我对此表示怀疑。过滤器无论如何都应该过滤数据。此外,最终的一致性查询有自己的api@TheUserWith,您提供的链接仅在使用祖先查询时适用,而您不使用。我不确定要使用哪个祖先键,因为没有祖先。employee是根实体。也许我遗漏了一些东西,但是为什么API返回查询指针来更新它呢?在我看来,这并不明智,至少在最常见的用例中是如此。@TheUsers不知道这是一个设计决策。通过这种方式,查询可以是不可变的,可以共享和重用的。@只有当您希望结果具有强一致性时,才需要不包含祖先密钥的用户。如果您对结果显示的几秒钟延迟感到满意,那么您不必这样做。还要注意的是,祖先键不必是现有实体的键,它只是语义。您可以创建任何虚构的密钥。对多个实体使用同一虚拟密钥会将它们放在同一实体组中,并且对该组的祖先查询将具有强一致性。因此,祖先基本上是一个种类锁。@userwithnothat不是种类,group。同一种类的多个实体可以有不同的父实体,也可以根本没有父实体,来自多个种类的实体可以有相同的父实体。
c, err := aetest.NewContext(&aetest.Options{StronglyConsistentDatastore: true})