GAE:列表上的NDB查询

时间:2017-09-29 19:29:10

标签: google-app-engine app-engine-ndb

Google App Engine NDB数据模型如下:

Users
    Username
    FirstName
    LastName

Posts
    PostID
    PosterUsername

SubscribedPosts
    PostID
    SubscriberUsername

对于特定用户,我想返回用户订阅的所有帖子并在页面上显示。

由于精彩的NDB不支持JOIN,我们会做两个查询:

postIDList = 
SubscribedPosts.query(SubscribedPosts.SubscriberUsername == 'johndoe').fetch()

这为我们提供了SubscribedPosts列表。那么如何获取postIDList列表并将其用作Posts查询的过滤条件?

类似的东西:

results = Posts.query(Post.PostID IN postIDList.PostID)

在普通的关系数据库中,这将是一个使用表连接的简单查询。这是如何在Google的ndb中完成的?

2 个答案:

答案 0 :(得分:2)

如果您尝试设计数据存储区模型,就像在此示例中设计关系数据库中的表一样,那么您将遇到许多瓶颈。

尽管还有其他解决方案,但您的评论可能是一个正确的方向。走这条路,我会放弃" subscribedPosts"模型一共使用User模型中的重复KeyProperty实体来存储订阅的帖子。

请参阅此相关帖子:One-To-Many Example in NDB

答案 1 :(得分:2)

似乎您希望模拟多对多关系,而不是一对多关系。阅读Modelling Entity Relationships(虽然这是针对年龄较大的db,而不是较新的ndb,但它仍然提出了这个想法。

两个实体中的一个应该维护相关其他实体的密钥列表(重复= True)。哪个实体应该列出清单?优选地,列表应该在通常具有较少关系的一侧,使得密钥列表较小。另一个考虑因素是哪一方可能对更新争用较少。

在您的具体情况下,让我们说平均用户订阅10个帖子,并且平均说每个帖子有100个用户订阅它。在这种情况下,我们希望将键列表放在关系的Users侧。

class Users(ndb.Model):
    user_name = ndb.StringProperty()
    first_name = ndb.StringProperty()
    last_name = ndb.StringProperty()
    posts = ndb.KeyProperty(kind='Posts', repeated=True)

class Posts(ndb.Model)
    post_id = ndb.StringProperty()
    poster_user_name = ndb.StringProperty()

通过添加Users实例中的列表来建立关系:

current_user.posts.append(current_post.key)

对于给定的Users个实例,由于订阅的Posts的密钥列表已在给定的Posts内,因此轻松获取所有订阅的Users

ndb.get_multi(given_user.posts)

对于给定的Posts个实例,请通过...

获取所有订阅Users
query = Users.query(Users.posts == given_post.key)