【问题标题】:Azure's CosmosDB: Query explorer get documents based on comparing timestamps as stringsAzure 的 CosmosDB:查询资源管理器通过比较时间戳作为字符串来获取文档
【发布时间】:2017-06-13 20:16:39
【问题描述】:

我在 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

    {"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 中花费更少的请求单位。

【问题讨论】:

    标签: python azure-cosmosdb


    【解决方案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 索引,至少对于比较属性是这样。查看索引配置示例here

    【讨论】:

    • 我在使用该查询时收到以下错误:“使用过滤器指定了一个无效查询,该过滤器针对不是范围索引的路径。考虑在请求中添加允许扫描标头。”跨度>
    • 我还编辑了什么问题并写了我想要的结果。
    • 我用“=”而不是比较器测试了您的查询,它可以工作。看起来您不能使用 '>' 或 '
    • 我告诉过你上面的错误。我得到这个:“一个无效的查询已经指定了过滤器针对不是范围索引的路径。考虑在请求中添加允许扫描标头。”
    • 实际上我测试了 SELECT VALUE "a" > "b" 它给了我 [false] 所以比较字符串确实有效。我想我现在理解了我的错误,这帮助我理解了它:stackoverflow.com/questions/31209970/… 所以我必须以某种方式启用我的 StartDateTime 的索引。我想知道我该怎么做?
    猜你喜欢
    • 2020-04-07
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多