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

Azure cosmosdb CosmosDB,通过嵌套数组帮助展平和过滤,azure-cosmosdb,Azure Cosmosdb,我正在尝试扁平化和过滤CosmosDB中的json数据。 数据如下所示,我希望将数组变量中的所有内容展平,然后根据数组中的特定_id和时间戳进行过滤: { "_id": 21032, "FirstConnected": { "$date": 1522835868346 }, "LastUpdated": { "$date": 1523360279908 }, "Variables": [ { "_id": 99999, "Values":

我正在尝试扁平化和过滤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
            }

       ]
    }
]
}   

如果您只希望通过嵌套的“\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请将此答案标记为已接受答案。然后在时间戳上发布另一个动态筛选问题。