Azure的CosmosDB:查询资源管理器基于将时间戳比较为字符串来获取文档

时间:2017-06-13 20:16:39

标签: python azure-cosmosdb

我在CosmosDB上有一些JSON文档,其中一个子节点是一个字符串,用以下格式表示日期和时间" yyyy-mm-dd HH:MM:SS"。我想知道查询资源管理器是否可以获取日期时间在特定范围内的所有文档。我尝试通过字符串比较来做,但我不知道如何做到这一点。我尝试了CompareTo函数,但是我的语法错误不正确。

这是我的每个文件的样子:

    { "Blocks": [...]
    }

由于查询资源管理器将所有文档合并在一起,这就是它在执行此查询时所提供的内容"从c"中选择*,这是一个包含多个字典的外部列表:

    [ 
     {"Blocks": [...]},
     {"Blocks": [...]},
     {"Blocks": [...]},
     ...
    ]

块' value是一个如下所示的列表:

    [
     {"StartDateTime" : "2017-06-12 16:00:00", ...},
     {"StartDateTime" : "2017-06-11 11:00:00", ...},
     {"StartDateTime" : "2017-06-12 13:00:00", ...},
     ...
    ]

其中内部列表中的每个元素都是一个字典,其中一个键是" StartDateTime"值为上面指定格式的字符串。

我的目标是能够查询该内部列表中StartDateTime> = DateTimeStringLower和StartDateTime<的值的所有项目。 DateTimeStringUpper。理想情况下,返回的文件应如下所示:

    {"Blocks":
     [
      {"StartDateTime" : "2017-06-12 16:00:00", ...},
      {"StartDateTime" : "2017-06-11 11:00:00", ...},
      {"StartDateTime" : "2017-06-12 13:00:00", ...},
     ...
     ]
    }

但如果它不完全相同,我可以解决它。

我已经尝试过此查询Select * from d in c.Blocks Where d.StartDateTime.CompareTo("2017-06-12") >= 0,但它在'('。这个命令是否会覆盖所有块?

上给我一个语法错误?

接近这个的正确方法是什么? 感谢。

PS:只是一个附带问题。一旦我弄清楚了正确的查询,我可以在python中使用它吗?我有这行代码docs = client.ReadDocuments(coll_link)。有没有办法在python中使用查询而不是所有文档来获取部分文档?它将花费更少的Azure请求单位。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的要求,以下查询应该完成这项工作:

SELECT VALUE Block 
  FROM c 
  JOIN Block IN c.Blocks
 WHERE Block.StartDateTime >= '2017-06-12' 
   AND Block.StartDateTime < '2017-06-13'

它会产生一个看起来像

的结果
[
  { "StartDateTime": "2017-06-12 16:00:00", ... },
  { "StartDateTime": "2017-06-12 13:00:00", ... },
  ...
]

为了比较工作,您需要在集合上启用Range索引,至少对于比较属性。请参阅index configurtion here的示例。