【问题标题】:Cosmos db Order by on 'computed field'Cosmos db 按“计算字段”排序
【发布时间】:2019-05-08 13:17:00
【问题描述】:

我正在尝试根据字符串状态选择数据。我想要的是状态'草稿'首先出现,所以我尝试了这个:

SELECT * 
FROM c 
ORDER BY c.status = "draft" ? 0:1

我收到一个错误:

不支持的 ORDER BY 子句。 ORDER BY 项目表达式无法映射到文档路径

我查看了 Microsoft 网站,我看到了这个:

ORDER BY 子句要求索引策略包括正在排序的字段的索引。 Azure Cosmos DB 查询运行时支持根据属性名称而非计算属性进行排序。

我想这使我想用查询做不可能的事情......我怎么能做到这一点?使用存储过程?

编辑

关于存储过程:实际上,我只是在考虑这个问题,这意味着,我需要在订购之前检索所有数据,这会很糟糕,因为我从数据库中获取最大 100 个值...有什么办法吗?可以这样做,所以我不必先检索所有数据?谢谢

谢谢!

【问题讨论】:

  • 您需要将此值存储在属性中。你不能做这样的内联计算。
  • 您好,我的回答对您有帮助吗?如果有,您可以将其标记为已回答。谢谢。
  • 您好 Jay,我在评论部分问了您一个问题(请参阅我帖子的编辑部分),我想知道使用 store proc 是否会让我在只想订购时扫描整个数据库?

标签: azure-cosmosdb


【解决方案1】:

ORDER BY 项目表达式无法映射到文档路径。

基本上,we are told 我们只能使用文档的属性进行排序,而不是派生值。 c.status = "draft" ? 0:1 是派生值。

我的想法:

查询sql的两个部分:第一个select c.* from c where c.status ='draft',第二个select c.* from c where c.status <> 'draft' order by c.status。最后,将它们组合起来。

或者您可以尝试使用您在问题中提到的存储过程来处理来自select * from c order by c.status 结果的数据。通过 if-else 条件将草稿数据放在其他人面前。

【讨论】:

  • 问题是我的状态列中有 4 个可能的值会影响 order by,我不想做 4 个查询...我应该尝试 store proc。谢谢
  • @Tom 好的,当您遇到任何 sp 问题时,请在此处发布,我会帮助您。
  • Jay,实际上,我只是在想这个,这意味着,我需要在订购前检索所有数据,这会很糟糕,因为我从我的数据库中获取最多 100 个值...是 tehre有什么办法可以做到,所以我不必先检索所有数据?谢谢!
  • @Tom - 请不要在 cmets 中开始讨论,或在答案下提出其他问题。 Stack Overflow 中确实没有办法支持这种类型的对话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2015-12-20
  • 1970-01-01
相关资源
最近更新 更多