【问题标题】:How to implement a where clause in Datastore on AppEngine如何在 AppEngine 上的 Datastore 中实现 where 子句
【发布时间】:2015-06-26 09:10:38
【问题描述】:

此 API 的目的是列出某个 User 电子邮件地址拥有的所有服务器。

如果我删除过滤器,则该方法会返回所有服务器(如预期的那样)。问题是我需要按特定的电子邮件地址进行过滤,该地址只会返回如下结果:

{
 "kind": "serverApi#resources",
 "etag": "\"q4aBTdWQBYSnhbijLrKGtcu63OU/cXL3GSvQ29gE3tK-4VKxQrWjAt0\""
}

我期待的结果类似于:

{
 "items": [
  {
   "id": "1",
   "hostname": "aaa",
   "ip": "192.168.1.2",
   "mac": "00:00:00:00:00:00",
   "user": "a@b.c",
   "domain": "HOME",
   "kind": "serverApi#resourcesItem"
  },
  {
   "id": "2",
   "hostname": "bbb",
   "ip": "192.168.1.1",
   "mac": "00:00:00:00:00:00",
   "user": "a@b.c",
   "domain": "HOME",
   "kind": "serverApi#resourcesItem"
  },
  {
   "id": "3",
   "hostname": "ccc",
   "ip": "192.168.1.3",
   "mac": "00:00:00:00:00:00",
   "user": "a@b.c",
   "domain": "HOME",
   "kind": "serverApi#resourcesItem"
  },
  {
   "id": "4",
   "hostname": "ddd",
   "ip": "192.168.1.4",
   "mac": "00:00:00:00:00:00",
   "user": "a@b.c",
   "domain": "HOME",
   "kind": "serverApi#resourcesItem"
  }
 ],
 "kind": "serverApi#resources",
 "etag": "\"q4aBTdWQBYSnhbijLrKGtcu63OU/cXL3GSvQ29gE3tK-4VKxQrWjAt0\""
}

我在 Endpoint 上使用的代码。

public CollectionResponse<Server> listServerByUser(User user) throws OAuthRequestException {
    List<Server> records = new ArrayList<Server>();

    Query<Server> query = ofy().load().type(Server.class).filter("mUser", user.getEmail());
    QueryResultIterator<Server> iterator = query.iterator();
    while (iterator.hasNext()) {
        records.add(iterator.next());
    }

    return CollectionResponse.<Server>builder().setItems(records).build();
}

AppEngine 仪表板上Datastore Viewer 中显示的列:

ID/NamemDomainmHostnamemIpmMacmUser

【问题讨论】:

  • 不清楚问题出在哪里:您没有得到您期望的所有记录,或者记录返回的数据与您期望的不同。请澄清一下。
  • 我预计会收到 4 个结果。电子邮件地址匹配。
  • 我看到您实际上是在使用 Objectify,并且您使用的字符串格式是正确的 [1](没有运算符意味着等于)。也许您正在过滤错误的属性(如果 'mUser' 是 'user' 而不是?)或 user.getEmail() 没有返回您认为的内容? [1]docs.objectify-appengine.googlecode.com/git/apidocs/com/…,java.lang.Object)

标签: google-app-engine google-cloud-endpoints google-cloud-datastore objectify


【解决方案1】:

您需要索引要过滤或排序的属性。

由于您使用的是 Objectify,因此您需要使用正确的 @Index 注释编辑 User

这是索引过程的完整指南

https://code.google.com/p/objectify-appengine/wiki/Queries

添加注释后,索引过程不再追溯。 您需要再次将所有实体放入每个实体的属性(使用 Objectify 进行简单的 get+put 就足够了)

【讨论】:

  • 这看起来很有希望。我今天早上检查时没有看到那个注释。我将在今天晚些时候再次检查。提供的文档链接也非常具有描述性。句子“查询仅返回索引中的值。如果实体字段未编入索引,则对该字段的查询将不返回任何结果。”如果我早点发现的话,会为我节省很多时间!
【解决方案2】:

如果 mUser 属性没有被索引,当你在过滤器中使用它时你不会找到任何结果。

【讨论】:

  • 这很可能是我的问题。如何将索引添加到列?如果有帮助,我正在使用 Android Studio。我找到了这个文件,这是正确的吗? cloud.google.com/appengine/docs/java/config/indexconfig
  • 您不需要为单个属性添加索引定义。您需要注释要索引的属性。
猜你喜欢
  • 2018-09-17
  • 2011-03-29
  • 2017-01-30
  • 1970-01-01
  • 2020-01-28
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多