在Google数据存储区中查找最大索引(博客系统中的分页)

时间:2015-05-19 20:21:23

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

我有一系列博客文章作为实体。我会收到一个如下所示的网址:/blog/page/1。在这种情况下,我想访问最近的5个帖子。在/blog/page/2的情况下,我想要最近的6-10。

所以请允许我做X-Y,因为我认为这是唯一的方法:

如何在使用Google Cloud Platform Datastore的众多实体中找到最大值? (我使用ndb

我可以为每个实体提供ID值,然后从ID < maxIndex - page * 5ID排序的查询中获取5。

但是,如何找到maxIndex?我是否从ID订购的查询中获取1,找到它ID,然后运行上一个操作?对于每个网页浏览来说,这似乎有点慢。

我怎样才能A)快速找到最大索引或B)否则实施分页?

谢谢!

1 个答案:

答案 0 :(得分:1)

对于游标,您可以使用数据存储区条目来存储游标,然后来回发送数据存储区密钥。通过发布请求发送数据来模糊它是另一种选择。

要回答您的原始问题:要获取顶部条目,请使用sort limit进行查询。这实际上会读取所有数据存储条目,因此您应该执行{{ 3}}搜索获取ID(密钥只是免费的)然后获得实际的帖子。所以像这样:

class IndexPage(webapp2.RequestHandler):
def get(self):
    maxIndex = Posts.query().order(-Posts.PostIndex).fetch(limit=1, keys_only=True)[0].get().PostIndex        
    page_number = 0
    post_lists = getPageResults(maxIndex, page_number)
    while len(post_lists) > 1:
        self.response.write("====================PAGE NUMBER %i===================</br>" % page_number)
        for post in post_lists:
            self.response.write(str(post.get().PostIndex) + "</br>")
        page_number += 1
        post_lists = getPageResults(maxIndex, page_number)


def getPageResults(maxIndex, page):
    index_range = (maxIndex - (page*5))
    post_index_list = range(index_range, index_range-5, -1)
    return Posts.query(Posts.PostIndex.IN(post_index_list)).order(-Posts.PostIndex).fetch(limit=5, keys_only=True)

请记住,我在几分钟内将它们放在一起,以说明使用keys_only和我上面提到的其他几点。