Google app engine GAE游标不处理使用IN,what';解决办法是什么?

Google app engine GAE游标不处理使用IN,what';解决办法是什么?,google-app-engine,google-cloud-datastore,objectify,Google App Engine,Google Cloud Datastore,Objectify,我试图对GAE的数据存储执行一个相当复杂的查询,基本上,订阅者可以订阅来自特定城镇或任何城镇(*)、特定国家或任何国家(*)、特定。。。或者任何。。。(*) 现在,当我想通知订阅者来自ZA的新闻时,我需要找到所有匹配country=ZA的订阅者,以及那些匹配country=*的订阅者,其他字段也是如此 Query<Subscriber> query = ofy().load().type(Subscriber.class); query = query.filter("s

我试图对GAE的数据存储执行一个相当复杂的查询,基本上,订阅者可以订阅来自特定城镇或任何城镇(*)、特定国家或任何国家(*)、特定。。。或者任何。。。(*)

现在,当我想通知订阅者来自ZA的新闻时,我需要找到所有匹配country=ZA的订阅者,以及那些匹配country=*的订阅者,其他字段也是如此

Query<Subscriber> query = ofy().load().type(Subscriber.class);

    query  = query.filter("searchCategory IN", Arrays.asList(new String[]{"*", category}));
    query = query.filter("searchCity IN", Arrays.asList(new String[]{"*", city}));
    query = query.filter("searchSuburb IN", Arrays.asList(new String[]{"*", suburb}));
    query = query.filter("searchTown IN", Arrays.asList(new String[]{"*", town}));
    query = query.filter("searchProvince IN", Arrays.asList(new String[]{"*", province}));
    query = query.filter("searchCountry IN", Arrays.asList(new String[]{"*", country}));
    query = query.limit(100);

    QueryResultIterator<Subscriber> iterator = query.iterator();
    while (iterator.hasNext()) {
        Subscriber subscriber = iterator.next();
        System.out.println(iterator.getCursor().toWebSafeString()); // exception here
    }
Query Query=ofy().load().type(Subscriber.class);
query=query.filter(“searchCategory IN”,Arrays.asList(新字符串[]{“*”,category}));
query=query.filter(“searchCity IN”,Arrays.asList(新字符串[]{“*”,city}));
query=query.filter(“search郊区”,Arrays.asList(新字符串[]{“*”,郊区}));
query=query.filter(“searchTown IN”,Arrays.asList(新字符串[]{“*”,town}));
query=query.filter(“searchProvince IN”,Arrays.asList(新字符串[]{“*”,province}));
query=query.filter(“searchCountry IN”,Arrays.asList(新字符串[]{“*”,country}));
query=query.limit(100);
QueryResulterator迭代器=query.iterator();
while(iterator.hasNext()){
订户订户=迭代器.next();
System.out.println(迭代器.getCursor().TowersFestring());//此处出现异常
}
我使用任务队列一次通知大量订阅者,一次通知100个订阅者(根据查询的不同,在20k到2M结果之间的任意位置),而游标似乎是将大量结果分解为可管理块的合乎逻辑的方式。。。在我运行应用程序并在尝试获取游标时遇到空指针异常之前,结果证明在使用IN语句时不支持游标

因为NOT_EQUAL和IN运算符是用多个 查询,使用它们的查询不支持游标,也不支持 使用CompositeFilterOperator.or构造的复合查询 方法


在这种情况下,如果我不能使用游标,那么还有什么选择呢?

一个选项是只使用equals独立运行这些查询。这将允许您只获取一些条目,但是除了光标之外,您还必须记住正在运行的查询。这也不能为您处理重复数据消除——如果您发送通知,这可能会破坏交易

你应该考虑一下这个问题。这是一个实验性的特性,但它正是您想要做的


基本思想是,为每个用户指定他们的订阅查询(例如
searchCountry=NZ
),然后当您处理新闻文章并将其发送到预期的搜索API时,它可以为您提供所有订阅(查询)其中一个选项是仅使用equals独立运行这些查询。这将允许您仅获取一些条目,但是除了光标之外,您还必须记住正在运行的查询。这也不会为您处理重复数据消除,如果您发送ut通知

你应该考虑看这个。这是一个实验性的特征,但它确实是你想做的。


基本思想是,为每个用户指定他们的订阅查询(例如
searchCountry=NZ
),然后当您处理新闻文章并将其发送到预期的搜索API时,它可以为您提供所有订阅(查询)其中一个选项是仅使用equals独立运行这些查询。这将允许您仅获取一些条目,但是除了光标之外,您还必须记住正在运行的查询。这也不会为您处理重复数据消除,如果您发送ut通知

你应该考虑看这个。这是一个实验性的特征,但它确实是你想做的。


基本思想是,为每个用户指定他们的订阅查询(例如
searchCountry=NZ
),然后当您处理新闻文章并将其发送到预期的搜索API时,它可以为您提供所有订阅(查询)其中一个选项是仅使用equals独立运行这些查询。这将允许您仅获取一些条目,但是除了光标之外,您还必须记住正在运行的查询。这也不会为您处理重复数据消除,如果您发送ut通知

你应该考虑看这个。这是一个实验性的特征,但它确实是你想做的。


基本思想是,为每个用户指定他们的订阅查询(如
searchCountry=NZ
),然后当您处理新闻文章并将其发送到预期的搜索API时,它可以为您提供与该文章匹配的所有订阅(查询)。

根据文档,我认为您可以使用光标

有些NDB查询不支持查询游标,但您可以修复它们。 如果查询使用IN、OR、OR!=,则查询结果将无法使用 游标,除非按键排序。如果应用程序不按 按键返回结果并调用fetch_page(),它将获得一个BadArgumentError。如果 User.query(User.name.IN(['Joe', “Jane']).order(User.name.fetch_页面(N)获取错误,请将其更改为” User.query(User.name.IN(['Joe','Jane'])).order(User.name,User.key).fetch_页面(N)


我建议您切换到NDB,因为它速度更快,并且具有自动缓存功能。根据文档,我认为您可以使用游标

有些NDB查询不支持查询游标,但您可以修复它们。 如果查询使用IN、OR、OR!=,则查询结果将无法使用 游标,除非按键排序。如果应用程序不按 按键返回结果并调用fetch_page(),它将获得一个BadArgu