Google App Engine数据存储查询问题

时间:2010-02-03 08:26:26

标签: google-app-engine google-cloud-datastore referenceproperty

我有以下问题:

我想检索所有类别的产品

class Category(emodel):
      name = db.StringProperty()

class Channel(emodel):
      name = db.StringProperty()
      category = db.ReferenceProperty(Category,collection_name="cat_set")

class Product(emodel):
      name = db.StringProperty()
      channel = db.ReferenceProperty(Channel,collection_name="ch_set")

现在我想写一个gql查询,它可以检索一个类别的所有内容。 例如:

Product.gql("WHERE channel.category == KEY (:1)", category_selected_key)

请记住,每个频道都可以经常更改其类别,因此我希望能快速避免cpu的额外工作

感谢

2 个答案:

答案 0 :(得分:2)

App Engine数据存储区不支持连接(这是您隐式尝试执行的操作)。解决此问题的最简单方法是将ProductProperty从Product添加到Category,其值与Product的Channel类别相同,从而对其进行非规范化处理,以便您可以简单地进行查询。

答案 1 :(得分:1)

使用GQL,你无法进行'嵌套'查询,你可以在SQL中过滤引用实体的属性(使用连接)。

由于您的Product实体中的引用仅存储引用的Channel实体的键,因此您必须先执行另一个查询以检索您尝试检索的类别的键:

selected_channel = Channel.gql("WHERE category = :1", category_selected_key).get()

category_products = Product.gql("WHERE channel = :1", selected_channel).fetch()