应用引擎数据存储区中的可用性日期范围查询?

时间:2014-04-27 04:43:10

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

我在这个主题上看了很多其他线程,到目前为止我还没有找到任何令人满意的答案,所以我想仔细检查数据存储是否真的不可行。

在数据存储区中,我有一组可以在特定时间段内预订的实体,因此它们附加了可用性范围。一个AvailabilityRange实体有一个开始和结束日期,我想找到完全包含所需日期范围的所有AvailabilityRanges。在SQL中,where子句看起来像:

WHERE AvailRange.startDate < :desiredStartDate AND AvailRange.endDate > :desiredEndDate

使用数据存储区时,这是不可能的,因为您不能在多个属性上使用不等式过滤器。另外,我看到一些关于将开始日期和结束日期存储在单个多值列表属性中的旧评论(因此,您在单个属性上有不等的过滤器),但这在app引擎中不起作用 - 请参阅#3博文:http://aleatory.clientsideweb.net/2009/11/28/google-app-engine-datastore-gotchas/

我也看过建议,例如,建议将所有可用天数存储在list属性中,这样你就可以对该列表属性进行直接相等过滤,但是如果你需要关闭那个解决方案并不真正有效你的范围的最小粒度。

因此,现在看起来这对数据存储区来说是不可能的。我现在的解决方案计划是使用App Engine搜索服务来存储可用性范围文档(因为搜索服务允许多个不等式过滤器),然后将它们映射回数据存储区中的实体。

任何人都有更好的建议吗?

2 个答案:

答案 0 :(得分:3)

如果您的实体数量相对较少(不是数百万),则可以运行两个仅按键的查询 - 一个用于开始日期,一个用于结束日期,然后查找结果的交集。仅键查询几乎是免费且非常快的。

如果您的数据存在其他一些限制,您可以使用它们来优化此过程。例如,如果可用性范围具有持续时间限制,则可以遍历开始日期查询,直到达到实体无法再可用的日期,因为开始日期与所需的结束日期相距太远。然后对结束日期查询执行相同的操作。

答案 1 :(得分:2)

按照您的建议使用搜索API。我遇到了多个不等式的问题,并且slso使用了搜索api来解决它。