通过两个属性优化ndb中的不等式查询

时间:2014-03-04 15:49:17

标签: python performance google-cloud-datastore app-engine-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)

但我不喜欢,因为我认为我使用太多的RAM从数据存储中检索更多的实体(或密钥),这是我最终需要的。

任何团体都知道更好的方法来进行此类查询吗?

在.get()之前使用.filter()是否足够?

由于

1 个答案:

答案 0 :(得分:1)

一种解决方案是创建一个新字段,例如start_week,它会对查询进行存储并允许您使用IN查询进行过滤:

q = Licence.query(Licence.start_week in range(5,30),
                  Licence.valid_to >= today,
                  ancestor = customer.key)

更简单:使用projection query来识别正确的数据集而无需获取完整实体。这比常规查询更快。

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)