我知道 KeysOnly 查询成本更低,但我想知道我是否正确实现了它。
例如,如果我为 KeysOnly 创建一个 GetAll 函数(如下所示),我是否仍应初始化用户结构 ([]User)?
func GetAllUserKeysByFilter(ctx context.Context, filters ...UserFilter) ([]*datastore.Key, error) {
var users []User
query := datastore.NewQuery("User").KeysOnly()
for _, filter := range filters {
if filter.Age != 0 {
query = query.Filter("Age =", filter.Age)
}
if filter.Limit != 0 {
query = query.Limit(filter.Limit)
}
}
keys, err := DatastoreClient().GetAll(ctx, query, &users)
if err != nil {
return nil, err
}
return keys, nil
}
此外,如果我只想获取直接调用的 key (我已经知道 namekey - 在本例中为 namekey == username)以检查此 key 是否存在怎么办与否,那么正确的做法是什么?
现在我是这样的:
func GetUserByNameKey(ctx context.Context, key *datastore.Key) (User, error) {
var user User
err := DatastoreClient().Get(ctx, key, &user)
if err != nil {
return user, err
}
return user, nil
}
但它是否可以以某种方式转换以变得更便宜,因为我只关心找出用户 key 是否存在?
使用 Limit == 1 的 GetAllUserKeysByFilter 可能会更便宜?
最佳答案
Get 操作(通过键获取)的成本是 1 次读取操作(而且不是小操作)。就成本而言,是否存在 key 的实际实体并不重要:两者都将花费您 1 次读取操作。 “难”的部分是找到 key 的实体,或者发现没有这样的实体,返回结果是“容易”的部分。
对于每个结果(对于每个结果键),仅键查询的成本是 1 次读取操作 + 1 次小型操作。
为了完整起见,“正常”查询(意味着非键查询)的成本是 1 次读取操作 + 1 次读取操作(针对每个返回的实体)。
示例:返回 10 个实体的普通查询是 11 次读取操作。返回 10 个键的纯键查询是 1 个读取操作 + 10 个小操作。 Get 调用是 1 个读取操作(无论是否找到并返回实体)。
所以调用GetAllUserKeysByFilter()与 limit = 1 理论上会花费更多:它花费 1 次读取操作和 1 次小操作。但由于小手术是免费的(不花真钱),所以它们基本上是平等的。但要知道 Get()除非您的实体很大,否则操作(按键)可能会更快。如果您的实体很大,请使用带有 limit = 1 的仅键查询.如果您的实体很小,Get()很可能会更快(衡量它是否对您很重要)。
有关查询费用的一些信息可以在此页面上找到:Datastore Queries
您的仅键查询的实现不必要地复杂。当您执行仅键查询时,dst Query.GetAll() 的目标参数被省略(未使用),只有返回值有用,这正是:结果键的 slice :
If q is a “keys-only” query, GetAll ignores dst and only returns the keys.
所以基本上你的解决方案也有效,但是 users不会使用 slice 。你的GetAllUserKeysByFilter()函数应如下所示:
func GetAllUserKeysByFilter(ctx context.Context, filters ...UserFilter)
([]*datastore.Key, error) {
query := datastore.NewQuery("User").KeysOnly()
for _, filter := range filters {
if filter.Age != 0 {
query = query.Filter("Age =", filter.Age)
}
if filter.Limit != 0 {
query = query.Limit(filter.Limit)
}
}
keys, err := DatastoreClient().GetAll(ctx, query, nil)
if err != nil {
return nil, err
}
return keys, nil
}
附言如果你想重复使用GetAllUserKeysByFilter()对于仅键查询和普通查询,您可以继续这样做,但您还应该返回 users slice 。
关于google-app-engine - Datastore KeysOnly 在 Go 中的定价和实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475093/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):
很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个
我的测试尝试访问网页并验证页面上是否存在某些元素。例如,它访问http://foo.com/homepage.html并检查Logo图像,然后访问http://bar.com/store/blah.html并检查页面上是否出现了某些文本。我的目标是访问经过Kerberos身份验证的网页。我发现Kerberos代码如下:主文件uri=URI.parse(Capybara.app_host)kerberos=Kerberos.new(uri.host)@kerberos_token=kerberos.encoded_tokenkerberos.rb文件classKerberosdefini
在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol
我有一堆要清理的URL。它们都包含UTM参数,在这种情况下不是必需的,或者是有害的。示例:http://houseofbuttons.tumblr.com/post/22326009438?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+HouseOfButtons+%28House+of+Buttons%29所有可能的参数都以utm_开头。如何使用ruby脚本/结构轻松删除它们而不破坏其他潜在的“好”URL参数? 最佳答案 您可以将正则表达式应用于url以清
我想在Rails中使用插件系统创建一个应用程序。潜在用户应该能够上传(或更好地从存储库安装)一个插件并安装它,使我的应用程序能够做更多的事情。这应该在没有FTP/SSH/对服务器的任何低级别访问的情况下完成。关于如何在Rails3中完成它,是否有任何好的gems或教程? 最佳答案 你看过http://edgeguides.rubyonrails.org/plugins.html了吗??它似乎不是100%兼容Rails3,但它可以帮助您入门。我看过的大多数插件文章都涉及Rails2。 关于