使用数据存储区查询在阵列上搜索

时间:2015-08-27 07:21:57

标签: google-app-engine google-cloud-datastore

我有兴趣从JDO查询迁移到数据存储区查询以使用AsyncDatastore API。

但是,我无法在数据存储区查询中进行以下查询:

//JDO query (working correctly)
PersistenceManager pm = PMF.get().getPersistenceManager();

Query query = pm.newQuery("SELECT FROM "
+ Tasks.class.getName()
+ " WHERE archivado==false & arrayUsers=="
+ user.getId()
+ " & taskDate != null & taskDate > best_before_limit "
+ "PARAMETERS Date best_before_limit "
+ "import java.util.Date");

List <Tasks> results= (List<Tasks>) pm.newQuery(query).execute(new Date());

//Datastore query (returning zero entities)

AsyncDatastoreService datastore = DatastoreServiceFactory.getAsyncDatastoreService();
com.google.appengine.api.datastore.Query query = new com.google.appengine.api.datastore.Query("Tasks");

Filter userFilter = new FilterPredicate("arrayUsers", FilterOperator.EQUAL,user.getId()); 
Filter filterPendingTasks = new FilterPredicate("taskDate", FilterOperator.LESS_THAN_OR_EQUAL , new Date()); 
Filter completeFilter = CompositeFilterOperator.and(filterPendingTasks,userFilter);

query.setFilter(completeFilter); 

List<Entity> results = datastore.prepare(query).asList(FetchOptions.Builder.withDefaults()); 

除了我必须从查询产生的实体中构建我的Task对象之外,这些应该是相同的。 问题是如果传递的用户id(user.getId())存在于数组(arrayUsers)中,则查询必须查找。 JDO这样做没有任何问题,但到目前为止还没有数据存储查询的快乐。

关于我的代码有什么问题的任何想法?

2 个答案:

答案 0 :(得分:1)

正如用户评论所指出的,您在数据存储区查询中使用了不同的属性。如果您有这样的查询,并且您没有完全确定索引,那么它将无法正常工作。如果没有看到你有哪些索引,我说这个查询看起来不错,所以要么你没有返回那里的数据(不太可能,因为你的JDO查询会这样做),或者你错过了一个过滤器。

一般情况下,在数据存储区中查询其中一个值是否与特定内容相等时,您确实会使用以下内容:

new Query("Widget").setFilter(new FilterPredicate("x", FilterOperator.EQUAL, 1))

由于您使用了相等过滤器,因此您无法获得时髦的结果(正如您在the docs中所看到的那样(查找&#34;具有多个值的属性可能会以令人惊讶的方式表现出来& #34;))

答案 1 :(得分:0)

目前,由于缺少&#34; CONTAINS&#34;无法使用数据存储查询来实现此目的。经营者或类似人员。

继续使用JDO的替代方法(至少对于这种类型的查询)。

相关问题