Sql Api के उपयोग से कॉसमॉसडॉब में जटिल नेस्टेड ऑब्जेक्ट को छोड़ना

Aug 17 2020

केवल उन उपयोगकर्ताओं को क्वेरी कैसे की जाती है जिनके Itemcount> जटिल नेस्टेड ऑब्जेक्ट से (डायनामिक कुंजी के साथ) sql एपीआई का उपयोग करके कोमोस्डब से? UDF को प्राथमिकता नहीं

कुछ इस तरह,

C। Cerna को 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"
        }
      }
  }
}

जवाब

NoahStahl Aug 17 2020 at 23:10

मुझे इस बात पर यकीन नहीं है कि अज्ञात कुंजियों को कैसे संभालना है, लेकिन यदि आप कुंजी को मूल्य के रूप में मॉडल करने के लिए तैयार हैं (सरल और क्लीनर मैं बहस करूँगा), तो आप हो सकते हैं:

{
    "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"
]

"ऑर्डर" एक आरक्षित कीवर्ड है और संदर्भ के लिए ब्रैकेट सिंटैक्स की आवश्यकता होती है।

SteveZhao Aug 18 2020 at 02:20

जैसा कि नूह जवाब देता है, मूल्य के रूप में कुंजी को प्राप्त करने का एक तरीका है।

इसके अतिरिक्त, आपके दस्तावेज़ के स्कीमा को बदले बिना प्राप्त करने का एक और तरीका है। इस तरह 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;
}

फिर इस वर्ग को चलाएँ:

SELECT c.Username FROM c where udf.getResult(c.Data)

परिणाम:

[
    {
        "Username": "User1"
    }
]