【问题标题】:Cosmos Db DateTime query in nested collection嵌套集合中的 Cosmos Db DateTime 查询
【发布时间】:2019-08-06 11:54:37
【问题描述】:

我正在尝试对 Cosmos DB 中的嵌套集合执行一些基本的 DateTime 操作。

以下是文档结构的示例:

{
    "id": "9a8b63d1-0b35-477a-9eee-f44bd41cbbcc",
    "Name": "Some Name",
    "StoredReports": [
        {
            "Name": "Test 1234",
            "CreatedOn": "2019-07-24T07:26:51.2395361Z"
        },
        {
            "Name": "Test 1234",
            "CreatedOn": "2019-07-29T07:26:51.2395361Z"
        }
    ]
}

我正在尝试做的只是对StoredReport.CreatedOn 字段进行一些基本操作。

这是一个例子:

SELECT * FROM c WHERE c.StoredReport.CreatedOn > '2019-07-25T07:26:51.2395361Z'

但这没有返回任何记录,我希望它返回文档但只有 1 个 StoredReport,我假设我没有正确查询它,因为它是一个嵌套集合。

【问题讨论】:

    标签: nosql azure-cosmosdb


    【解决方案1】:

    首先,您的文档包含StoredReports 属性和您的sql 查询StoredReport 列。它们不匹配。

    那么,StoredReports是一个数组,所以需要使用EXISTS来查询嵌套文档。

    SELECT * 
    FROM c
    WHERE EXISTS (
        SELECT VALUE s 
        FROM s IN c.StoredReports 
        WHERE s.CreatedOn > '2019-07-25T07:26:51.2395361Z'
     ) 
    

    请参阅https://docs.microsoft.com/azure/cosmos-db/sql-query-subquery 了解更多展开选项。

    【讨论】:

    • 啊,好吧,这似乎是我遗漏的信息。这将返回一个不同的数据结构(如预期的那样)。但是是否有可能让它像原始文档一样返回 JSON(好像我正在过滤 StoredReport 数组)?如果你明白我的意思
    • @JamieRees 当然,请使用:SELECT c.id,c.Name,c.StoredReports FROM c join s in c.StoredReports WHERE s.CreatedOn > '2019-07-25T07:26:51.2395361Z'
    • @JamieRees 因为你使用了JOIN,所以你不能使用select * from c。但是,您可以定义要过滤的每一列,例如:select c.a1,c.a2,c.a3......from c ....
    • @JamieRees 我误解了你的要求吗?
    • 感谢您的帮助,我对这个概念很陌生,但您帮助填补了一些空白。非常感谢!
    猜你喜欢
    • 2021-12-14
    • 2019-04-21
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2019-01-21
    相关资源
    最近更新 更多