Abfragen komplexer verschachtelter Objekte in cosmosdb mit SQL Api

Aug 17 2020

Wie können nur Benutzer abgefragt werden, deren Itemcount> 10 aus dem komplexen verschachtelten Objekt (mit dynamischem Schlüssel) aus comosdb mithilfe der SQL-API abgefragt wird? UDF nicht bevorzugt.

Etwas wie,

Wählen Sie c.username aus c aus, wobei 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"
        }
      }
  }
}

Antworten

NoahStahl Aug 17 2020 at 23:10

Ich bin mir nicht sicher, wie ich mit unbekannten Schlüsseln umgehen soll, aber wenn Sie bereit sind, den Schlüssel stattdessen als Wert zu modellieren (einfacher und sauberer, würde ich argumentieren), könnten Sie Folgendes haben:

{
    "Username": "User1",
    "Data": [
        {
            "Id": "RandomGUID123",
            "Order": {
                "Item": "ItemName123",
                "ItemCount": 40
            },
            "ShipmentNumber": "7657575"
        },
        {
            "Id": "RandomGUID976",
            "Order": {
                "Item": "ItemName7686",
                "ItemCount": 7
            },
            "ShipmentNumber": "876876"
        }
    ]
}

Mit einer Abfrage wie:

SELECT DISTINCT VALUE(c.Username) 
FROM c
JOIN (SELECT VALUE d from d IN c.Data where d["Order"].ItemCount > 10)

Ergebnis:

[
    "User1"
]

"Order" ist ein reserviertes Schlüsselwort und erfordert die Klammer-Syntax als Referenz.

SteveZhao Aug 18 2020 at 02:20

Wenn Noah antwortet, ist das Modellieren des Schlüssels als Wert ein Weg, um dies zu erreichen.

Darüber hinaus gibt es eine andere Möglichkeit, ohne das Schema Ihres Dokuments zu ändern. Erstellen Sie UDF wie folgt:

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;
}

Führen Sie dann diese SQL aus:

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

Ergebnis:

[
    {
        "Username": "User1"
    }
]