Запрос сложного вложенного объекта в cosmosdb с использованием sql Api
Как запрашивать только тех пользователей, у которых Itemcount> 10, из сложного вложенного объекта (с динамическим ключом) из comosdb с помощью sql api? UDF не рекомендуется.
Что-то вроде,
Выберите c.username из c, где c.Data [*]. Order.ItemCount> 10;
{
{
"Username": "User1",
"Data": {
"RandomGUID123": {
"Order": {
"Item": "ItemName123",
"ItemCount" : "40"
},
"ShipmentNumber": "7657575"
},
"RandomGUID976": {
"Order": {
"Item": "ItemName7686"
"ItemCount" : "7"
},
"ShipmentNumber": "876876"
}
}
},
{
"Username": "User2",
"Data": {
"RandomGUID654": {
"Order": {
"Item": "ItemName654",
"ItemCount" : "9"
},
"ShipmentNumber": "7612575"
},
"RandomGUID908": {
"Order": {
"Item": "ItemName545"
"ItemCount" : "6"
},
"ShipmentNumber": "6454"
}
}
}
}
Ответы
Я не уверен в том, как обрабатывать неизвестные ключи, но если вы хотите вместо этого смоделировать ключ как значение (я бы сказал, что проще и понятнее), у вас может быть:
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
С таким запросом:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
Результат:
[
"User1"
]
«Порядок» - зарезервированное ключевое слово, для ссылки на него требуется синтаксис скобок.
Как отвечает Ной, моделировать ключ как значение - это способ достижения.
Кроме того, есть еще один способ добиться без изменения схемы документа. Создайте UDF следующим образом:
function getResult(data){
for(var key in data){
const itemCount = data[key].Order.ItemCount;
if (parseFloat(itemCount).toString() != "NaN" && parseFloat(itemCount) > 10 ) {
return true;
}
}
return false;
}
Затем запустите этот sql:
SELECT c.Username FROM c where udf.getResult(c.Data)
Результат:
[
{
"Username": "User1"
}
]