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 ответа:
Если вы хотите сгладить данные из массива переменных с помощью свойств корневого объекта, вы можете запросить свою коллекцию следующим образом:
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