Azure cosmosdb CosmosDB,通过嵌套数组帮助展平和过滤
我正在尝试扁平化和过滤CosmosDB中的json数据。 数据如下所示,我希望将数组变量中的所有内容展平,然后根据数组中的特定_id和时间戳进行过滤:Azure cosmosdb CosmosDB,通过嵌套数组帮助展平和过滤,azure-cosmosdb,Azure Cosmosdb,我正在尝试扁平化和过滤CosmosDB中的json数据。 数据如下所示,我希望将数组变量中的所有内容展平,然后根据数组中的特定_id和时间戳进行过滤: { "_id": 21032, "FirstConnected": { "$date": 1522835868346 }, "LastUpdated": { "$date": 1523360279908 }, "Variables": [ { "_id": 99999, "Values":
{
"_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
}
]
}
]
}
如果您只希望通过嵌套的“\u id”属性进行过滤,那么可以使用ARRAY\u CONTAINS w/将partial\u match参数设置为true。查询将如下所示:
SELECT VALUE c
FROM c
WHERE ARRAY_CONTAINS(c.Variables, {_id: 99998}, true)
SELECT root._id, root.FirstConnected, root.LastUpdated, var.Values
FROM root
JOIN var IN root.Variables
WHERE var._id = 99998
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
如果还希望展平阵列,则可以使用JOIN
SELECT VALUE v
FROM v IN c.Variables
WHERE v._id = 99998
如果要使用根对象的属性展平变量数组中的数据,可以按如下方式查询集合:
SELECT VALUE c
FROM c
WHERE ARRAY_CONTAINS(c.Variables, {_id: 99998}, true)
SELECT root._id, root.FirstConnected, root.LastUpdated, var.Values
FROM root
JOIN var IN root.Variables
WHERE var._id = 99998
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
这将导致:
[
{
"_id": 21032,
"FirstConnected": {
"$date": 1522835868346
},
"LastUpdated": {
"$date": 1523360279908
},
"Values": [
{
"Timestamp": {
"$date": 1523270312001
},
"Value": 8888
}
]
}
]
如果您想将值数组展平,则需要编写如下内容:
SELECT VALUE c
FROM c
WHERE ARRAY_CONTAINS(c.Variables, {_id: 99998}, true)
SELECT root._id, root.FirstConnected, root.LastUpdated, var.Values
FROM root
JOIN var IN root.Variables
WHERE var._id = 99998
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
请注意,CosmosDB将“Value”视为保留关键字,您需要使用ESCPAP语法。此查询的结果是:
[
{
"_id": 21032,
"FirstConnected": {
"$date": 1522835868346
},
"LastUpdated": {
"$date": 1523360279908
},
"Timestamp": "1970-01-01T00:00:00Z",
"Value": 8888
}
]
查看更多详细信息谢谢!如果我还想要{“_id”:21032,“FirstConnected”:{“$date”:1522835868346},“LastUpdated”:{“$date”:1523360279908}对于每个变量。_id那么查询会是什么样子?@baatchen您想要的结果的最终格式是什么?请在您的问题中对其进行排序?您可以这样做:从c中选择值c在c中加入v。变量在其中…感谢大家的帮助。我的最终结果是:选择根。_id为hpid,root.FirstConnected[“$date”]作为FirstConnected,root.LastUpdated[“$date”]作为LastUpdated,var._id作为varid,var.Values[0]。Timestamp[“$date”]作为Timestamp,var.Values[0][“Value”]作为Val从root.Variables中加入var._idin(999989999)和var.Values[0]。Timestamp[“$date”]>=1523270312001最后一个问题是,他们是否是动态筛选UnixTimeStamp中的时间戳值的好方法。假设我想从今天开始筛选最后5天?@baatchen请将此答案标记为已接受答案。然后在时间戳上发布另一个动态筛选问题。