考虑到一天中的时间范围(营业时间),您如何创建一个在当前时间内返回实体的索引。
我犯了一个错误,假设一个只包含打开和关闭时间的列表属性可以在app引擎上运行。以下操作失败,因为两个不等式过滤器必须匹配列表中的相同值:
Select * FROM Business WHERE hours < now AND hours > now
现在我有点投入,除了使用很长一段时间之外没有解决方案,每30分钟切片一次,效率非常低:
[900, 930, 1000, 1030, 1100, 1130, 1200, 1230, 1300, 1330, 1400, 1430, ... ]
任何人都知道有一种聪明的方式来打开和关闭时间或以其他方式解决这个问题吗?
答案 0 :(得分:2)
新答案: 我想了一下,我认为你实际上已经有了原始想法的解决方案。对于每个企业,都有一个storehours ListProperty,它只存储业务开放的时间,就像您目前所做的那样。然后计算当前时间,并将其四舍五入到最近的半小时,所以12:50 - &gt; 1200,然后进行查询
now = 1200
Select * FROM Business WHERE now in hours
我不确定正确的GQL查询语法,但肯定有一个“in”过滤器。
OLD ANSWER(不读): 我正在做类似的事情,我没有真正的解决方案,除了“尝试不同的东西”。
首先,您需要存储打开和关闭时间。可以作为两个单独的字段,也可以将它们编码为一个字段,例如“09001700”表示9-5,甚至是“M09001700”。或者将两者哈希成一个数字,我不认为这会产生巨大的差异,无论你采用哪种方式。
然后是坏消息。我在数论上并不是特别擅长,但我们在这里要做的是编码两组线性数字(开启和关闭时间),这样你就可以做一个线性的&gt;或者&lt;比较第三个代表'now'的数字。我不认为这是可能的,你只能获得一个成功的&gt;或者&lt;比较两个数字中的一个,无论是开放还是关闭。因此,鉴于我们只能对一个属性进行不等式,我认为不可能只有一个查询只隔离开放存储。我也认为你不需要做两个查询,你只需要在开放时间做一个查询,然后过滤它们以查看哪些是关闭的。如果你
你不一定需要将两个大集合在一起。您可以查询现在所有项目&gt; opentime,并手动过滤搜索结果,查找现在&lt; closetime。如果您根据关闭时间对查询进行排序,这应该会使过滤更容易。
我最终使用的解决方案(可能对您有用)是根本不查询商店营业时间,而是查询将返回更有限数据集的内容,然后根据商店营业时间过滤返回的结果。例如,如果您的用户按位置进行搜索,则根据位置查询您的商家,并按商店营业时间过滤生成的商家,然后仅向用户显示已打开的商家。
答案 1 :(得分:0)
这样做的一个方法是为每个企业设置一个操作和关闭时间,并查看一天中的时间是否介于两者之间。
但是对于大表,由于索引,您可能需要进行两次单独的查询。一个查询是查看时间是否大于opentime,另一个查询是否小于关闭时间。这将是两个索引。
不是理想的解决方案,但它可能比您尝试的更有效。