优化ndb中的两个属性的不等式查询
我正在尝试查询一系列有效的日期
q = Licence.query(Licence.valid_from <= today,
Licence.valid_to >= today,
ancestor = customer.key
).fetch(keys_only=True)
我知道Datastore不支持对两个属性进行不等式查询。 所以我这样做:
kl = Licence.query(Licence.valid_from <= today,
ancestor = customer.key
).fetch(keys_only=True)
licences = ndb.get_multi(kl)
for item in licences:
if item.valid_to < today:
licence.remove(item)
但我不喜欢这样,因为我觉得我从Datastore中获取了太多的实体(或键),而这些其实我最后并不需要。
有没有人知道更好的方法来进行这种类型的查询?
在调用.get()之前使用.filter()就够了吗?
谢谢
1 个回答
1
一种解决办法是创建一个新的字段,比如叫做start_week,这样可以把查询分组,并允许你使用IN查询来过滤数据:
q = Licence.query(Licence.start_week in range(5,30),
Licence.valid_to >= today,
ancestor = customer.key)
更简单的方法是使用投影查询,这样可以在不获取完整实体的情况下找到正确的数据集。这种方法比普通查询要快。
it = Licence.query(License.valid_from <= today,
ancestor = customer.key
).iter(projection=[License.valid_to])
keys = [e.key for e in it if e.valid_to >= today]
licenses = ndb.get_multi(keys)