在App Engine中检索NDB Cursor以获取自定义页码

时间:2017-05-19 17:50:37

标签: google-app-engine cursor app-engine-ndb

我正在我们的网页上实现SEO友好的无限滚动,因为我们在URL中使用?page参数,因此如果用户在第15页看到一些有趣的内容,他可以将链接复制到一些好友他的

我们使用ElasticSearch作为主要搜索引擎,但是,可能会有一段时间,当它关闭时,我需要使用来自ndb的备份方案。

假设我们的ElasticSearch已关闭。我们正在使用ndb的备份方案。用户直接进入第15页。如果我没有执行Cursor个查询,我是否有办法检索第15页fetch_page(每页10个实体),所以不知道{{1 }}或next prev值?

1 个答案:

答案 0 :(得分:1)

  
    

我有没有办法检索第15页的Cursor(每页10个实体),假设我没有执行fetch_page查询,所以不知道next或prev Cursor值?

  

如果我理解正确,您希望为给定查询的结果集中的给定起点检索ndb.Cursor对象,没有使用fetch_page执行任何先前的查询。

请参阅https://cloud.google.com/appengine/docs/standard/python/datastore/query-cursors,为方便起见,这是一个相关的代码段:

  
    

“执行检索操作后,应用程序可以获取光标......”

  

基本上,Cursor对象只能通过查询获取 (或从预先存在的urlsafe游标重建,但显然这对我们没有帮助)。所以简短的回答是“不 - 你必须调用fetch_page”。

虽然最终Cloud Datastore不是您案例的最佳工具,但有一种方法可以实现您所寻求的行为。您 必须先实际调用fetch_page()。在您的情况下,由于您知道页面大小和页码,您可以简单地为(10 * 15)条记录qry.fetch_page(page_size=150)执行单个fetch_page并忽略返回的记录,只需隐藏返回的ndb.Cursor对象以供使用后续查询,它将实际获取用户正在查找的数据集。是的,这需要额外的RPC,但根据您查询的型号,开销可能不会太高(我不知道您的用例的详细信息)。

使用该游标的后续查询可以使用您希望显示客户端的正常页面大小执行 - 10条记录等。这是因为来自一个查询的游标对使用该游标执行的后续查询的页面大小没有要求。它实际上只是指数据集中的一个点。注意:此 意味着您需要对所有查询保持相同的过滤器/排序顺序 - 在查询之间更改这将意味着您需要一个新游标。

希望有所帮助!