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
的键列表。要查询 Pet
s,我会这样做:
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.
由于 owner
在 IN
过滤器中使用,因此无法投影。由于您需要 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
你得到的结果将等同于你正在寻找的原始投影查询.
不幸的是,这仅适用于同一实体的一个或极少数此类投影查询,否则您需要将实体拆分成太多部分。所以你可能不得不妥协。
您可以在
中找到有关实体拆分的更多详细信息
假设我有一个模型:
class Pet(ndb.Model):
age = ndb.IntegerProperty(indexed=False)
name = ndb.StringProperty(indexed=True)
owner = ndb.KeyProperty(indexed=True)
我有一个名为 owners
的键列表。要查询 Pet
s,我会这样做:
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.
由于 owner
在 IN
过滤器中使用,因此无法投影。由于您需要 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
你得到的结果将等同于你正在寻找的原始投影查询.
不幸的是,这仅适用于同一实体的一个或极少数此类投影查询,否则您需要将实体拆分成太多部分。所以你可能不得不妥协。
您可以在