列表查询,facebook中的朋友列表?

时间:2010-08-31 06:59:46

标签: python google-app-engine

在GAE的基于python的facebook应用程序中,我想检查当前用户的哪些朋友已经“标记”了网页。

为此,我必须运行与朋友数量一样多的数据库查询(比如100) 我担心这可能会因为大量的查询而进入“超时”。

Google DOCs建议“列表”查询并行运行,这会节省时间吗? 此列表的限制为30,因此我必须进行2或3个列表类型的查询。

如果可能的话,请建议更好的方法,使用任务问题或其他......

2 个答案:

答案 0 :(得分:1)

我建议如下:

  • 将标记为'标记'的实体作为标记它们的用户的子实体。
  • 使用基于标记为
  • 的网页的网址的“已标记”实体的密钥名称
  • 要查找已标记页面的朋友,检索朋友列表,然后从朋友列表中生成实体键列表(很简单,因为您知道朋友键和URL),并执行单个批处理检索“标记”实体列表,指明哪些朋友已标记该页面。

答案 1 :(得分:1)

如果您已经知道其密钥或密钥名称,则可以并行获取最多1000个实体。

有几种方法可以解决您的具体问题。这是一个。

假设当用户“标记”网页时,您创建一个具有key_name的实体,该实体派生自用户的facebook id和页面密钥。

class PageMarker(db.Model):
    user = db.ReferenceProperty(AppUser)
    ....
    @classmethod
    def mark_page(cls, user, page_key):
        marker = cls.get_or_insert("%s_%s" % (user.facebook_id, 
                                             page_key, user=user)

这允许您获取并行标记页面的所有用户:

key_names = ["%s_%s" % (friend.facebook_id, page_key) for friend in friends]
markers = db.get(key_names)
# Use get_value_for_datastore to get the entity key without making a trip to the 
# datastore
friends_who_bookmarked_keys = [marker.__class__.user.get_value_for_datastore(marker)\
                          for marker in markers]
friends = db.get(friends_who_bookmarked_keys)