Google app engine 如何在AppEngine上的数据存储中实现where子句

Google app engine 如何在AppEngine上的数据存储中实现where子句,google-app-engine,google-cloud-endpoints,google-cloud-datastore,objectify,Google App Engine,Google Cloud Endpoints,Google Cloud Datastore,Objectify,此API的目的是列出某个用户电子邮件地址拥有的所有服务器 如果删除该过滤器,则该方法将返回所有服务器(如预期的那样)。问题是,我需要按特定的电子邮件地址进行筛选,该地址只会返回以下结果: { "kind": "serverApi#resources", "etag": "\"q4aBTdWQBYSnhbijLrKGtcu63OU/cXL3GSvQ29gE3tK-4VKxQrWjAt0\"" } 我期待的结果类似于: { "items": [ { "id": "1", "h

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

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

{
 "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();
}
public CollectionResponse listServerByUser(用户用户)引发OAuthRequestException{
列表记录=新的ArrayList();
Query Query=ofy().load().type(Server.class).filter(“mUser”,user.getEmail());
QueryResulterator迭代器=query.iterator();
while(iterator.hasNext()){
add(iterator.next());
}
return CollectionResponse.builder().setItems(records.build();
}
AppEngine仪表板上的数据存储查看器中显示的列:

ID/Name
mDomain
mHostname
mIp
mMac
mUser


如果mUser属性未编制索引,则在筛选器中使用它时将找不到任何结果。

您需要为正在进行筛选或排序的属性编制索引

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

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

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

不清楚问题是什么:您没有得到您期望的所有记录,或者该记录返回了您期望的不同数据。请澄清。我希望收到4个结果。电子邮件地址匹配。我看到您实际使用的是Objectify,并且您使用的字符串格式正确[1](无运算符表示等于)。可能您在错误的属性上进行了筛选(如果是“mUser”,则为“user”),或者user.getEmail()没有返回您认为的内容?[1] ,java.lang.Object)这很可能是我的问题。如何向列添加索引?如果有帮助的话,我正在使用Android Studio。我找到了这份文件,是否正确?您不需要为单个属性添加索引定义。您需要对要索引的属性进行注释。这看起来非常有希望。今天早上检查时,我没有看到那个注释。今天晚些时候我会再检查一遍。提供的文档链接也非常具有描述性。“查询只返回索引中的值。如果实体字段未被索引,则该字段上的查询将不会返回结果”这句话,如果我早点发现的话,会节省我很多时间!