Azure Cosmos DB:查询资源管理器根据将时间戳作为字符串进行比较来获取文档
Azure's CosmosDB: Query explorer get documents based on comparing timestamps as strings
我在 CosmosDB 上有几个 JSON 文档,其中一个子节点是一个表示日期和时间的字符串,格式如下 "yyyy-mm-dd HH:MM:SS"。我想知道是否可以使用查询资源管理器获取日期时间在特定范围内的所有文档。我试图通过字符串比较来做到这一点,但我不知道该怎么做。我尝试了 CompareTo 函数,但我会得到一个不正确的语法错误。
这是我的每个文档的样子:
{ "Blocks": [...]
}
由于查询浏览器将所有文档合并在一起,这就是执行此查询后给我的结果 "Select * from c",一个包含多个词典的外部列表:
[
{"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 中花费更少的请求单位。
如果我正确理解了您的要求,下面的查询应该可以完成工作:
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", ... },
...
]
要进行比较,您需要在 collection 上启用范围索引,至少对于比较 属性。查看索引配置示例 here.
我在 CosmosDB 上有几个 JSON 文档,其中一个子节点是一个表示日期和时间的字符串,格式如下 "yyyy-mm-dd HH:MM:SS"。我想知道是否可以使用查询资源管理器获取日期时间在特定范围内的所有文档。我试图通过字符串比较来做到这一点,但我不知道该怎么做。我尝试了 CompareTo 函数,但我会得到一个不正确的语法错误。
这是我的每个文档的样子:
{ "Blocks": [...]
}
由于查询浏览器将所有文档合并在一起,这就是执行此查询后给我的结果 "Select * from c",一个包含多个词典的外部列表:
[
{"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 中花费更少的请求单位。
如果我正确理解了您的要求,下面的查询应该可以完成工作:
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", ... },
...
]
要进行比较,您需要在 collection 上启用范围索引,至少对于比较 属性。查看索引配置示例 here.