NDB 查询在 .IN() 中使用的属性上进行投影

NDB query with projection on an attribute used in .IN()

假设我有一个模型:

class Pet(ndb.Model):
    age = ndb.IntegerProperty(indexed=False)
    name = ndb.StringProperty(indexed=True)
    owner = ndb.KeyProperty(indexed=True)

我有一个名为 owners 的键列表。要查询 Pets,我会这样做:

pets = Pets.query(Pets.owner.IN(owners)).fetch()

问题是这个查询 returns 整个实体。

我怎样才能进行预测查询并只获取所有者和名称?

或者我应该如何构造数据以仅获取名称和所有者。

我可以为 name 做一个投影,但我失去了从宠物到主人的参考。而且owner不能在投影中。

正如您所注意到的,您无法使用您提到的确切上下文来执行此操作,因为您点击了 Limitations on projections:

之一
  • Properties referenced in an equality (=) or membership (IN) filter cannot be projected.

由于 ownerIN 过滤器中使用,因此无法投影。由于您需要 owner 并且无法对其进行投影,因此您必须放弃投影,因此您将始终获得整个实体。

一种替代方法是将您的实体拆分为 2 个对等实体,始终是 1:1 关系,使用相同的实体 ID:

class PetA(ndb.Model):
    name = ndb.StringProperty(indexed=True)
    owner = ndb.KeyProperty(indexed=True)

class PetB(ndb.Model):
    age = ndb.IntegerProperty(indexed=False)

这样你可以做同样的查询,除了 PetA kind 而不是原来的 Pet 你得到的结果将等同于你正在寻找的原始投影查询.

不幸的是,这仅适用于同一实体的一个或极少数此类投影查询,否则您需要将实体拆分成太多部分。所以你可能不得不妥协。

您可以在

中找到有关实体拆分的更多详细信息