CosmosDB, помогите сгладить и отфильтровать по вложенному массиву


Я пытаюсь сгладить и отфильтровать мои данные json, которые находятся в CosmosDB. Данные выглядят следующим образом, и я хотел бы сгладить все переменные массива, а затем отфильтровать по определенным _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 2

2 ответа:

Если вы хотите сгладить данные из массива переменных с помощью свойств корневого объекта, вы можете запросить свою коллекцию следующим образом:

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" как зарезервированное ключевое слово, и вам нужно использовать синтаксис escpape. Результатом этого запроса является:

[
  {
    "_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

Если вы ищете фильтрацию только по вложенному свойству '_id', то вы можете использовать ARRAY_CONTAINS с аргументом partial_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