GAE 游标无法使用 IN 的查询,解决方法是什么?



我正在尝试对 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
    }

我正在使用任务队列一次通知大量订阅者,一次通知 100 个(根据查询,结果在 20k 到 2M 之间),游标似乎是将大量结果分解为可管理块的合乎逻辑的方法......直到我运行应用程序并收到尝试获取光标的空指针异常 - 事实证明使用 IN 语句时不支持游标。

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

在这种情况下,看到我无法使用游标,有什么替代方法?

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

某些NDB查询不支持查询游标,但您可以修复它们。 如果查询使用 IN、OR 或 !=,则查询结果将不适用于 游标,除非按键排序。如果应用程序未订购 按键和调用 fetch_page() 的结果,它得到一个 BadArgumentError。如果 User.query(User.name.IN(['Joe', 'Jane'])).order(User.name).fetch_page(N) 收到错误,将其更改为 User.query(User.name.IN(['Joe', 'Jane'])).order(User.name, User.key).fetch_page(N)

我建议您切换到NDB,因为它更快并且具有自动缓存

一种选择是仅使用等于独立运行这些查询中的每一个。这将允许您只抓取一些条目,但是除了光标之外,您还必须记住您正在运行的查询。这也不会为您处理重复数据消除 -- 如果您要发送通知,这可能会破坏重复数据消除。

您应该考虑查看预期搜索 API。这是一个实验性功能,但它完全可以执行您想要执行的操作。

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

最新更新