大量属性的单个数据存储查询顺序

Individual datatsore query oder for large number of properties

我有一个拥有超过 25 个属性的实体。在这 25 个中,有 15 个属性显示在前端 table。这些 table 将允许对每个属性进行排序(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

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

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

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

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

如果您传递的参数始终与您的 属性 名称相匹配,那么您可以将 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)