此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
答案 0 :(得分:1)
如果未对mUser属性编制索引,则在过滤器中使用它时不会找到任何结果。
答案 1 :(得分:1)
您需要索引要过滤或订购的属性。
由于您使用的是Objectify,因此需要使用正确的User
注释编辑@Index
类
以下是索引编制过程的完整指南
https://code.google.com/p/objectify-appengine/wiki/Queries
添加注释后,索引过程不具有追溯性。 你需要再次将所有实体放入每个实体的属性(一个简单的get + put与Objectify就足够了)