Optimizing a inequality query in ndb over two properties

流过昼夜 提交于 2019-12-11 05:14:24

问题


I'm trying to do a query into a range of valid dates

q = Licence.query(Licence.valid_from <= today, 
                  Licence.valid_to >= today,
                  ancestor = customer.key               
                  ).fetch(keys_only=True)

I know that Datastore doesn't support inequality queries over two propperties. So I do this:

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)

But I don't like because I think that I use too much RAM retrieving more entities (or keys) from the Datastore that I finally need.

Any body knows a better way of doing this type of queries?

Is enough to use .filter() before .get()?

Thanks


回答1:


One solution would be to create a new field, like start_week, which buckets the queries and allows you to use an IN query to filter:

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

Even simpler: Use a projection query to identify the right set of data without fetching full entities. This is faster than a regular 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)


来源:https://stackoverflow.com/questions/22176586/optimizing-a-inequality-query-in-ndb-over-two-properties

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!