在 Google 数据存储中查找最大索引(博客系统中的分页)
Find Maximum Index in Google Datastore (Pagination in Blog System)
我有一系列的博客文章作为实体。我将收到如下所示的 URL:/blog/page/1
。在这种情况下,我想访问最近的 5 个帖子。在/blog/page/2
的情况下,我想要最近的第6-10个。
所以请允许我做一个 X-Y,因为我认为这是唯一的方法:
如何使用 Google Cloud Platform Datastore 找到众多实体中的最大值? (我正在使用 ndb
)
我可以给每个实体一个 ID 值,然后从 ID < maxIndex - page * 5
按 ID
排序的查询中获取 5。
但是,我如何找到 maxIndex
?我是否从按 ID
排序的查询中获取 1,发现它是 ID
,然后 运行 之前的操作?这对于 每个页面浏览量 .
来说似乎有点慢
我怎样才能 A) 快速找到最大索引或 B) 否则实现分页?
谢谢!
对于游标,您可以使用数据存储条目来存储游标,然后来回发送数据存储密钥。通过 post 请求发送数据来掩盖它是另一种选择。
回答您原来的问题:要获得顶部条目,请使用 sort with a limit of 1. This will actually read all the Datastore entries so you should do a keys only 搜索进行查询以获取 ID(仅密钥是免费的),然后获取实际的 posts。所以像这样:
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 和我上面提到的其他要点。
我有一系列的博客文章作为实体。我将收到如下所示的 URL:/blog/page/1
。在这种情况下,我想访问最近的 5 个帖子。在/blog/page/2
的情况下,我想要最近的第6-10个。
所以请允许我做一个 X-Y,因为我认为这是唯一的方法:
如何使用 Google Cloud Platform Datastore 找到众多实体中的最大值? (我正在使用 ndb
)
我可以给每个实体一个 ID 值,然后从 ID < maxIndex - page * 5
按 ID
排序的查询中获取 5。
但是,我如何找到 maxIndex
?我是否从按 ID
排序的查询中获取 1,发现它是 ID
,然后 运行 之前的操作?这对于 每个页面浏览量 .
我怎样才能 A) 快速找到最大索引或 B) 否则实现分页?
谢谢!
对于游标,您可以使用数据存储条目来存储游标,然后来回发送数据存储密钥。通过 post 请求发送数据来掩盖它是另一种选择。
回答您原来的问题:要获得顶部条目,请使用 sort with a limit of 1. This will actually read all the Datastore entries so you should do a keys only 搜索进行查询以获取 ID(仅密钥是免费的),然后获取实际的 posts。所以像这样:
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 和我上面提到的其他要点。