Cosmos db在“计算字段”上排序

时间:2019-05-08 13:17:00

标签: azure-cosmosdb

我正在尝试根据状态(字符串)选择数据。我想要的是状态“草稿”首先出现,因此我尝试了以下方法:

import json

with open("test.json") as json_file:
    json_data = json.load(json_file)

for g in json_data["features"]:
    poly = g["geometry"]
    cntr_code = g["properties"]["CNTR_CODE"]
    nuts_id = g["properties"]["NUTS_ID"]
    name = g["properties"]["NUTS_NAME"]
    if cntr_code == "AT":
        print(nuts_id)
        # do plotting etc
    else: # delete it if it is not part a specific country
        json_data["features"].remove(g)  # line in question

# do something else with the json_data

我得到一个错误:

  

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

我检查了Microsoft网站,并看到了以下内容:

  

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

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

修改

关于存储过程:实际上,我只是在考虑这一点,这意味着我需要在订购前检索所有数据,这很糟糕,因为我从数据库中获取了最大100的值...可以做到,所以我不必先检索所有数据吗?谢谢

谢谢!

1 个答案:

答案 0 :(得分: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条件将草稿数据置于其他数据之前。