Sql Api kullanarak cosmosdb'de karmaşık iç içe geçmiş nesneyi sorgulama
Sql api kullanarak comosdb'deki karmaşık iç içe nesneden (dinamik anahtarlı) yalnızca Itemcount> 10 olan kullanıcıları nasıl sorgulayabilirim? UDF tercih edilmez.
Gibi bir şey,
C. Veri [*]. 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"
}
}
}
}
Yanıtlar
Bilinmeyen anahtarların nasıl ele alınacağından emin değilim, ancak bunun yerine anahtarı bir değer olarak modellemeye istekliysen (daha basit ve daha temiz olduğunu iddia ediyorum), sahip olabilirsin
{
"Username": "User1",
"Data": [
{
"Id": "RandomGUID123",
"Order": {
"Item": "ItemName123",
"ItemCount": 40
},
"ShipmentNumber": "7657575"
},
{
"Id": "RandomGUID976",
"Order": {
"Item": "ItemName7686",
"ItemCount": 7
},
"ShipmentNumber": "876876"
}
]
}
Şunun gibi bir sorgu ile:
SELECT DISTINCT VALUE(c.Username)
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)
Sonuç:
[
"User1"
]
"Sıra" ayrılmış bir anahtar kelimedir ve başvurmak için köşeli ayraç sözdiziminin kullanılmasını gerektirir.
Noah yanıt verirken anahtarı, bir değer elde etmenin bir yolu olarak modelleyin.
Ek olarak, belgenizin şemasını değiştirmeden elde etmenin başka bir yolu vardır. Bunun gibi UDF oluşturun:
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;
}
Sonra bu sql'yi çalıştırın:
SELECT c.Username FROM c where udf.getResult(c.Data)
Sonuç:
[
{
"Username": "User1"
}
]