【问题标题】:Cosmos DB paginated query with custom order by clause使用自定义 order by 子句的 Cosmos DB 分页查询
【发布时间】:2020-08-16 15:20:52
【问题描述】:

我想在 Cosmos DB 中执行一个选择查询,返回最大数量的结果(比如 50 个),然后给我继续令牌,以便我可以从中断的地方继续搜索。

现在假设我的查询在 where 子句中有 2 个相等条件,例如

where prop1 = "a" and prop2 = "w" and prop3 = "g"

在返回的结果中,我希望首先出现满足 prop1 = "a" 的记录,然后是 prop2 = "w" 的结果,然后是 prop3 = "g" 的结果。

我为什么需要它?因为虽然我可以将所有数据放到我的应用程序中并在那里进行排序,但显然我不能提取所有记录,因为这意味着提取太多数据。因此,如果我不能在 cosmos 本身中以这种方式订购它,那么在我得到的结果中,我可能只有那些根本没有 prop1 = "a" 的记录。现在我可以继续重试,直到我得到带有 prop1 = "a" 的那些(我需要这个,因为我想向用户显示带有 prop1 = "a" 的结果作为第一组结果)但我可能不得不拉因为我的 Cosmos DB 中有一个庞大的数据集,所以获得第一条记录需要 100 次。

如何在 Cosmos 中处理这种情况?谢谢!

【问题讨论】:

  • 是的,但我不能自定义排序吗?就像我如何对上面的场景进行排序以应用顺序然后使用偏移限制?
  • 我会添加一个答案。这是可能的,但您需要做一些工作。
  • @Andy 谢谢!对此的任何帮助将不胜感激!

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

因此,如果我正确理解了您的问题,您希望完成此操作:

SELECT * FROM c
WHERE
        c.prop1 = 'a'
    AND
        c.prop2 = 'b'
    AND
        c.prop3 = 'c'
ORDER BY
        c.prop1, c.prop2, c.prop3
OFFSET 0 LIMIT 25

现在,幸运的是 CosmosDB SQL 中的 you can now do this。但是,有一个警告。你必须在你的收藏中set up a composite index 才能允许这样做。

因此,对于这个集合,我的复合索引将如下所示:

现在,如果我想把它改成这样:

SELECT * FROM c
WHERE
        c.prop1 = 'a'
    AND
        c.prop2 = 'b'
    AND
        c.prop3 = 'c'
ORDER BY
        c.prop1 DESC, c.prop2, c.prop3
OFFSET 0 LIMIT 25

我可以添加另一个复合索引来覆盖该用例。您可以在设置中看到它是一个数组数组,因此您可以添加任意数量的组合。

如果我正确理解了您的问题,这应该可以让您到达您需要的地方。

【讨论】:

  • 谢谢。这实际上真的很有帮助。在同一场景中,我还有另一个用例,其中所有 3 个条件都在同一个属性上,但我希望它们以自定义方式排序,如下所示: c.prop1 = 'a' AND c.prop1 = 'b' AND c.prop1 = 'c' 但我希望 c.prop1='b' 的条目先出现,然后是 c,然后是 a,但由于这里没有明确的字母顺序,不知道如何继续。另外,不幸的是,道具本身容纳了另一个 json 对象。
  • 我尝试了一些疯狂的子查询连接来支持自定义优先级顺序,类似这样的东西,但这也不起作用,因为它不允许我按来自这样的子查询的列进行排序。 stackoverflow.com/questions/63456506/…
猜你喜欢
  • 2019-04-23
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多