【问题标题】:Google Cloud Datastore filter data which contains the items in a ListGoogle Cloud Datastore 过滤包含列表中项目的数据
【发布时间】:2019-11-28 10:47:56
【问题描述】:

在我们的 Google Cloud Datastore 中,我们有一个属性(companies 属性),它存储字符串列表,当我们查询我们的数据存储时,我们希望将 Java 列表发送到数据存储 API 并获取公司属性至少包含的数据列表中的项目之一。我们当前的查询代码在下面,但是我们无法找到如何在此代码上设置列表过滤器。有人知道吗?

public List<MAExchangeNews> getExchangeNews(IExchangeController controller,int count, String offsetVal, List<String> relatedCompanySymbols) {
    List<MAExchangeNews> result = null;
    if (controller != null) {
        EntityQuery.Builder builder = Query.newEntityQueryBuilder();
        builder.setKind(KIND_NAME);
        builder.setLimit(count);
        builder.setOrderBy(OrderBy.desc(FIELD_NEWS_TIME));
        if (offsetVal != null) {
            builder.setStartCursor(Cursor.fromUrlSafe(offsetVal));
        }
        if (relatedCompanySymbols != null) {

//This is the area we want to add our filtering code        //builder.setFilter(PropertyFilter.Operator.GREATER_THAN_OR_EQUAL_VALUE);
        }

        Query<Entity> query = builder.build();

        QueryResults<Entity> resultList = datastore.run(query);
        result = entitiesToNews(controller,resultList);         
        if (result != null) {
            this.nextOffset = resultList.getCursorAfter().toUrlSafe();
        }           
    }

    return result;
}

作为示例,我们想要实现的目标:

- Our DataStore Entities Company Properties :
  1. FROTO, KCHOL
  2. KCHOL, ALBRK
  3. AKBNK, GARAN
  4. ALBRK, ACSEL

- Our query List
  1. {KCHOL,GARAN}

- Expected Result:
  1. FROTO, KCHOL
  2. KCHOL, ALBRK
  3. AKBNK, GARAN

我认为我们需要的是一个包含查询,其中包含 or 语句(如果可能的话),或者一个 in 查询。但我不知道我们如何使用 Google Cloud Datastore API 来实现它。

谢谢

【问题讨论】:

    标签: java google-cloud-datastore datastore


    【解决方案1】:

    我不熟悉java。但谷歌云数据存储一点点。 Google Cloud Datastore 有五种类型的过滤器(=&lt;&lt;=&gt;&gt;=) on query 所以你只能使用一个 out of filter。

    为了得到 1 的结果。{KCHOL,GARAN} 您可以尝试使用两个查询,第一个查询为 KCHOl 查找数据,第二个查询为 GARAN 查找数据并合并它。

    Google Cloud Datastore 中没有与 In 类似的内容。 可能此指南有助于找到您的解决方案。

    【讨论】:

      【解决方案2】:

      我不得不说,我对此没有任何实际经验。根据我在 API 文档中找到的内容,可以像这样添加过滤器:

      if (relatedCompanySymbols != null && !relatedCompanySymbols.isEmpty()) {
          builder.setFilter(new FilterPredicate("companies", Query.FilterOperator.IN, relatedCompanySymbols));
      }
      

      不确定这是否可行,但有关过滤器的文档说明:

      如果给定名称的属性是数组值,则实体 如果任何值与该值比较,则满足过滤器 以比较描述的方式在过滤器中指定 运算符。

      【讨论】:

        猜你喜欢
        • 2016-05-24
        • 2021-01-12
        • 2018-04-18
        • 1970-01-01
        • 2021-01-08
        • 2018-12-20
        • 2015-11-23
        • 2018-05-19
        相关资源
        最近更新 更多