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

1 投票
1 回答
619 浏览
提问于 2025-04-17 20:47

我正在尝试查询一系列有效的日期

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)

撰写回答