如何在 AppEngine 上的 Datastore 中实现 where 子句

How to implement a where clause in Datastore on AppEngine

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

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

{
 "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\""
}

我在端点上使用的代码。

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/Name mDomain mHostname mIp mMac mUser

如果 mUser 属性 未编入索引,当您在过滤器中使用它时将不会找到任何结果。

您需要为过滤或订购的属性编制索引。

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

这是索引过程的完整指南

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

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