首页 文章

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

提问于
浏览
0

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

这就是我的每个文档的样子:

{ "Blocks": [...]
    }

由于查询资源管理器将所有文档合并在一起,因此它可以执行此查询“Select * from c”,这是一个包含多个字典的外部列表:

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

Blocks的值是一个如下所示的列表:

[
     {"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 回答

  • 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的示例 .

相关问题