如何在 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 就足够了)
这个 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 就足够了)