Google Cloud Datastore 过滤包含列表中项目的数据

Posted

技术标签:

【中文标题】Google Cloud Datastore 过滤包含列表中项目的数据【英文标题】:Google Cloud Datastore filter data which contains the items in a List 【发布时间】: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 来实现它。

谢谢

【问题讨论】:

【参考方案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));

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

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

【讨论】:

以上是关于Google Cloud Datastore 过滤包含列表中项目的数据的主要内容,如果未能解决你的问题,请参考以下文章

库 appengine.api.datastore 和 com.google.cloud.datastore 有啥区别?

App Engine 上 Cloud Datastore 的客户端库 - NDB 或 google-cloud-datastore

Google Cloud Datastore 客户端库创建实体

在 Google Cloud Datastore 上使用动态类型

Google Cloud Datastore Emulator 如何验证我们的 datastore-index.xml?

无法连接到本地 Google Cloud Datastore 模拟器