CosmosDB,通过嵌套数组帮助展平和过滤

baa*_*hen 6 azure-cosmosdb

我正在尝试展平和过滤 CosmosDB 中的 json 数据。数据如下所示,我想展平数组变量中的所有内容,然后按数组内的特定 _id 和时间戳进行过滤:

{
"_id": 21032,
"FirstConnected": {
    "$date": 1522835868346
},
"LastUpdated": {
    "$date": 1523360279908
},
"Variables": [
    {
        "_id": 99999,
        "Values": [
            {
                "Timestamp": {
                    "$date": 1522835868347
                },
                "Value": 1
            }
        ]
    },
    {
        "_id": 99998,
        "Values": [
            {
                "Timestamp": {
                    "$date": 1523270312001
                },
                "Value": 8888
            }

       ]
    }
]
}   
Run Code Online (Sandbox Code Playgroud)

Sac*_*tin 4

如果您想使用根对象的属性来展平变量数组中的数据,您可以像这样查询您的集合:

SELECT root._id, root.FirstConnected, root.LastUpdated, var.Values
FROM root 
JOIN var IN root.Variables
WHERE var._id = 99998
Run Code Online (Sandbox Code Playgroud)

这将导致:

[
  {
    "_id": 21032,
    "FirstConnected": {
      "$date": 1522835868346
    },
    "LastUpdated": {
      "$date": 1523360279908
    },
    "Values": [
      {
        "Timestamp": {
          "$date": 1523270312001
        },
        "Value": 8888
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

如果您想展平 Values 数组,您将需要编写如下内容:

SELECT root._id, root.FirstConnected, root.LastUpdated, 
       var.Values[0].Timestamp, var.Values[0]["Value"]
FROM root 
JOIN var IN root.Variables
WHERE var._id = 99998
Run Code Online (Sandbox Code Playgroud)

请注意,CosmosDB 将“Value”视为保留关键字,您需要使用 escpape 语法。该查询的结果是:

[
  {
    "_id": 21032,
    "FirstConnected": {
      "$date": 1522835868346
    },
    "LastUpdated": {
      "$date": 1523360279908
    },
    "Timestamp": "1970-01-01T00:00:00Z",
    "Value": 8888
  }
]
Run Code Online (Sandbox Code Playgroud)

检查更多详细信息https://learn.microsoft.com/en-us/azure/cosmos-db/sql-api-sql-query#Advanced