单个数据表查询oder以获取大量属性

时间:2016-06-30 11:59:01

标签: python google-app-engine optimization query-optimization google-cloud-datastore

我有一个超过25个属性的实体。在这25个中,15个属性显示在前端表中。这些表允许对每个属性进行排序(ASC和DESC)。

要在后端处理此问题,我要检查订单类型并在ASC和DESC订单的每个属性上编写查询。为了处理15个记录排序,我有很多看起来相似的行代码。唯一不同的是订单类型。

代码如下所示:

@classmethod
def retrieve(cls, order, limit, offset):
    if order == '-property_1':
        results = cls.query(ancestor=parent).order(-cls.property_1).fetch(limit, offset=offset)
    elif order == 'property_1':
        results = cls.query(ancestor=parent).order(cls.property_1).fetch(limit, offset=offset)
        .
        .
        .
        .
    elif order == '-property_15':
        results = cls.query(ancestor=parent).order(-cls.property_15).fetch(limit, offset=offset)
    elif order == 'property_15':
        results = cls.query(ancestor=parent).order(cls.property_15).fetch(limit, offset=offset)

它为每个属性创建了2个数据存储区索引。

- kind: EntityName
  ancestor: yes
  properties:
  - name: property_1

- kind: EntityName
  ancestor: yes
  properties:
  - name: property_1
    direction: desc

我的问题是,有没有更好的方法来处理这种情况?

2 个答案:

答案 0 :(得分:2)

如果您传递的参数始终与您的属性名称匹配,那么您可以使用以下内容替换if语句:

desc = False
if order[0] == '-':
  order = order[1:]
  desc = True

query = cls.query(ancestor=parent)
order = getattr(cls, order)
if desc:
  order = -order

query = query.order(order)
results = query.fetch(limit, offset=offset)

答案 1 :(得分:1)

不,您正在以正确的方式处理索引。

如果您的数据规模较小且增长相对有限,则可以切换到客户端排序,如果您想避免创建15 * 2索引。

或者,如果父项(实体组)的数量很小并且您可以使用最终一致性,则可以省略ancestor = parent子句,只需在客户端中按父级过滤即可。这将使您能够使用内置的属性索引(两个订单方向),而不需要复合索引。