2012-07-30 48 views
0

我在GAE上有一个应用程序,允许用户将\编辑帖子添加到任何任意路径(如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中不可能的连接。

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

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

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

您是否有存储在别处的所有路径的唯一列表?如果是这样,你可以为每个路径查询并获取最新的。这会导致更多的操作,但可能会比尝试计算独立路径更快。 – Sologoub 2012-07-30 18:08:18

+0

不,我没有这样的列表。我只有WikiPosts表。 – 2012-07-31 11:07:41

回答

1

既然你没有的路径的单独的列表,因为GAE不支持SQL的SELECT DISTINCT的当量(见hereherehere),你必须

  1. 生成列表每次显示主页时(不建议一次超过几百个帖子)或
  2. 创建另一个表格/模型以追踪添加新帖子时的唯一路径(然后将此新表格与Shay的答案组合使用)或
  3. 如您所述,请保留tr每条路径的最新帖子的答案。

我想选择3是你最好的选择,因为(这是常有与GAE的情况下),你会投入数据存储你想摆脱(即做写有利于更复杂的到底是什么快速阅读。)

+0

谢谢,我会再添加一个新字段 – 2012-08-01 14:51:11

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) 

这将返回每个路径将最新的帖子。

+0

我应该为路径变量分配什么值?我没有任何路径列表。 – 2012-07-31 11:13:16

0

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