Google数据存储区:使用过滤器查询随机实体

时间:2016-02-18 20:45:06

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

目前我正在尝试查询位置实体,过滤两个范围过滤器,将纬度和经度限制为当前视图。

该查询应该以随机分布的形式返回有限数量的实体。查询as-it-is会返回Latitude排序的集合。

Location Entity: Latitude, Longitude, ...

到目前为止,我的方法如下:我引入了一个randomKey属性,其类型为double,其范围为[0 ... 1]。我将它存储在每个Location实体的数据存储区中,并尝试按该属性进行排序:

Location Entity: Latitude, Longitude, ..., randomKey

但执行此查询后:

Query query = new Query("Location");
query.addSort("randomKey", Query.SortDirection.ASCENDING);
query.setFilter(latitudeRangeFilter);
query.setFilter(longitudeRangeFilter);

我得到了一个IllegalArgumentException:

java.lang.IllegalArgumentException: The first sort property must be the same as the property to which the inequality filter is applied.  In your query the first sort property is randkey but the inequality filter is on longitude

有人可以就如何继续提供建议吗?我的做法是对的,还是有更好的方法?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您的查询不起作用,因为您在两个不同的属性上指定了不等式过滤器。您可能需要使用GeoSpacial query

对于随机性,可能更容易检索指定范围内的所有实体,然后随机选择所需的结果数。

如果位置数量是可管理的,您可能希望将所有这些位置保留在memcache中作为列表,而不是每次都查询数据存储区。然后您可以遍历该列表以获得结果,这将非常快并且不会产生任何阅读费用。