【问题标题】:Selecting only the latest post for each url仅选择每个 url 的最新帖子
【发布时间】:2012-07-28 08:39:34
【问题描述】:

我在 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")

【问题讨论】:

  • 您是否有存储在其他地方的所有路径的唯一列表?如果是这样,您可以对每个路径进行查询并获取最新的。这将导致更多的操作,但可能比尝试动态计算唯一路径更快。
  • 不,我没有这样的清单。我只有 WikiPosts 表。

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,那我加个新字段
【解决方案2】:

您可以致电:

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

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

【讨论】:

  • 我应该为路径变量分配什么值?我没有任何路径列表。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2011-10-11
    • 1970-01-01
    • 2011-03-14
    • 2021-12-30
    • 2021-06-18
    相关资源
    最近更新 更多