在 App Engine 中检索自定义页码的 NDB 游标

Retrieve NDB Cursor for custom page number in App Engine

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

我们正在使用 ElasticSearch 作为主要搜索引擎,但是,当它出现故障时,我可能需要使用备用方案,来自 ndb

比方说,我们的 ElasticSearch 宕机了。我们正在使用来自 ndb 的备份方案。用户直接进入第 15 页。如果我没有执行 fetch_page 查询,有什么方法可以检索第 15 页的 Cursor(每页 10 个实体),所以不知道 [=17] =] 或 prev Cursor 值?

Is there any way I can retrieve Cursor for page 15(and 10 entities per page), assuming I was not performing fetch_page queries, so don't know next or prev Cursor values?

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

查询

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

"After performing a retrieval operation, the application can obtain a cursor..."

基本上,游标对象只能通过查询获得(或从预先存在的 urlsafe 游标重建,但显然这对我们没有帮助)。所以简短的回答是 "no - you must call fetch_page".

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

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

希望对您有所帮助!