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)

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

我的问题类似于这个问题(在每个 GROUP BY 组中选择第一行?)但答案涉及使用在 GAE 中不可能的连接。

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

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

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

3 回答 3

1

由于您没有唯一的路径列表,并且由于 GAE 不支持 SQL 的等效项SELECT DISTINCT(请参见此处此处此处),因此您必须

  1. 每次显示主页时生成该列表(不推荐超过几百个帖子),或者
  2. 创建另一个表/模型以跟踪添加新帖子时的唯一路径(然后将此新表与 Shay 的答案结合使用),或
  3. 正如您所说,跟踪每个路径的最新帖子。

我认为选项 3 是您最好的选择,因为(就像 GAE 的情况一样),您将准确地放入数据存储区(即,使写入更复杂以支持快速读取。)

于 2012-07-31T15:11:51.900 回答
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)

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

于 2012-07-30T18:26:28.617 回答
0

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

于 2012-08-03T04:01:08.403 回答