【问题标题】:Optimizing a inequality query in ndb over two properties在 ndb 中针对两个属性优化不等式查询
【发布时间】:2014-03-04 15:49:17
【问题描述】:

我正在尝试对一系列有效日期进行查询

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()就够了吗?

谢谢

【问题讨论】:

    标签: python performance google-cloud-datastore app-engine-ndb


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2019-08-03
      • 2023-01-12
      相关资源
      最近更新 更多