代码之家  ›  专栏  ›  技术社区  ›  baatchen

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

  •  5
  • baatchen  · 技术社区  · 6 年前

    我正在尝试扁平化和过滤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
                }
    
           ]
        }
    ]
    }   
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Samer Boshra    6 年前

    如果您只想通过嵌套的“\u id”属性进行筛选,那么可以使用ARRAY\u CONTAINS,并将partial\u match参数设置为true。查询如下所示:

    SELECT VALUE c
    FROM c
    WHERE ARRAY_CONTAINS(c.Variables, {_id: 99998}, true)
    

    如果还想展平阵列,则可以使用JOIN

    SELECT VALUE v
    FROM v IN c.Variables
    WHERE v._id = 99998
    
        2
  •  3
  •   Sacha Bruttin    6 年前

    如果要使用根对象的属性展平变量数组中的数据,可以按如下方式查询集合:

    SELECT root._id, root.FirstConnected, root.LastUpdated, var.Values
    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 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
      }
    ]
    

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