
(第一个)问题是:
q := datastore.NewQuery("employee")q.Filter("Name =", "Andrew W")Query.Filter()返回包含您指定的过滤器的派生查询。您必须存储返回值并持续使用它:
q := datastore.NewQuery("employee")q = q.Filter("Name =", "Andrew W")或仅一行:
q := datastore.NewQuery("employee").Filter("Name =", "Andrew W")注意:没有此查询,您执行的查询将没有过滤器,因此将返回所有先前保存的那种实体
"employee",其中
"JoeCitizen"可能是您看到的第一个打印的实体。
对于第一次运行,您很可能会看到0个结果。请注意,由于您不使用Ancestor查询,因此 最终的一致性适用
。开发SDK会模拟高复制数据存储库及其最终一致性,因此
Put()*** 作后的查询将看不到结果。
如果
time.Sleep()在进行查询之前先输入少量内容,则会看到预期的结果:
time.Sleep(time.Second)var e2 Employeeq := datastore.NewQuery("employee").Filter("Name=", "Andrew W")// Rest of your pre...还要注意,在SDK中运行代码可以通过创建如下上下文来模拟 强一致性 :
c, err := aetest.NewContext(&aetest.Options{StronglyConsistentDatastore: true})但这当然只是出于测试目的,您不能在生产中这样做。
如果要获得高度一致的结果,请在创建键时指定一个祖先键,然后使用祖先查询。仅当您想要非常一致的结果时才需要祖先键。如果您满意,但可以延迟几秒钟才能显示结果,则不必这样做。还要注意,祖先键不必是现有实体的键,而只是语义。您可以创建任何虚构的密钥。对多个实体使用相同的(虚构的)键会将它们放入同一实体组,并且该组上的祖先查询将保持高度一致。
祖先键通常是一个现有键,通常是从当前用户或帐户派生的,因为它可以轻松创建/计算,并且可以保存/存储一些其他信息,但是如上所述,不必如此。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)