仅为每个网址选择最新帖子

时间:2012-07-30 16:25:43

标签: google-app-engine google-cloud-datastore python-2.7 gql

我在GAE上有一个应用程序,允许用户将\ edit帖子添加到任意路径(如wiki)。我将所有帖子存储在一个表中。该表的结构如下:

class WikiPosts(db.Model):
    path = db.StringProperty(required = True)
    content = db.TextProperty(required = True)
    date_created = db.DateTimeProperty(auto_now_add = True)

在主页上,我想显示每条路径的最新帖子。

我的问题与此问题相似(Select first row in each GROUP BY group?),但答案涉及使用GAE中无法实现的联接。

我可以有一个专用字段来跟踪每个网址的最新帖子但是可以使用gql查询吗?

截至目前,我正在使用此查询返回按创建时间排序的所有wiki帖子的所有版本。

db.GqlQuery("SELECT * FROM WikiPosts ORDER BY date_created DESC limit=10")

3 个答案:

答案 0 :(得分:1)

由于您没有唯一的路径列表,并且由于GAE不支持等效的SQL SELECT DISTINCT(请参阅hereherehere) ,你必须

  1. 每次显示主页时生成该列表(一旦超过几百个帖子,不建议使用),或
  2. 创建另一个表/模型,以便在添加新帖子时跟踪唯一路径(然后将此新表与Shay的答案结合使用),或
  3. 如您所述,跟踪每条路径的最新帖子。
  4. 我认为选项3是您最好的选择,因为(通常是GAE的情况),您将把数据存储完全放入您想要的内容(即,使写入更复杂,有利于快速读取。 )

答案 1 :(得分:0)

您可以致电:

def get_latest_posts(amount=10):
  return db.GqlQuery("SELECT * FROM WikiPosts where path =:1 ORDER BY date_created DESC limit=:2", path, amount)

这将为每条路径返回最新帖子。

答案 2 :(得分:0)

与每次页面访问进行查询有很多相关的问题。当然,您可能拥有更多的实例,并且必须与支持查询的索引的最终一致性相抗衡。由于您的页面只是十大列表,为什么不简单地使用memcache对象进行管理?如果找不到该对象,则执行查询并编写缺少的memcache对象。发布列表更新将在实体put()之前写入/重写内存缓存 - 这可能是延迟函数(任务队列)的良好候选者。