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

时间:2015-04-19 18:58:02

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

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

我在终端上使用的代码。

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 Dashboard上的Datastore Viewer中显示的列:

  

ID/Name mDomain mHostname mIp mMac mUser

2 个答案:

答案 0 :(得分:1)

如果未对mUser属性编制索引,则在过滤器中使用它时不会找到任何结果。

答案 1 :(得分:1)

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

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

以下是索引编制过程的完整指南

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

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