2017-10-24 3 views
0

Ich habe eine Azure Cosmos DB mit dem folgenden Dokument unten. In diesem hat die Person mit E-Mail [email protected] 3 Rollen, wie kann ich dies abfragen, um eine Liste mit der E-Mail plus die 3 Rollen zurückzugeben? Alles, was ich gerade jetzt habe, ist das Folgende, aber das gibt doppelte E-Mail-Adressen zurück.Abfrage Azure Cosmos DB, keine Duplikate

SELECT c.Email, o.RoleDesc 
FROM c 
JOIN o IN c.OrgRoles 
WHERE c.Email = "[email protected]" 


{ 
    "id": "23452345234", 
    "Email": "[email protected]", 
    "OrgRoles": [ 
     { 
      "RoleID": "234234", 
      "RoleDesc": "worker" 
     }, 
     { 
      "RoleID": "345678", 
      "RoleDesc": "Manager" 
     }, 
     { 
      "RoleID": "456433", 
      "RoleDesc": "Admin" 
     } 
    ], 
    "DeviceIDs": [ 
     { 
      "Device": "ABC-12312" 
     }, 
     { 
      "Device": "DEF-76576" 
     } 
    ], 
    "UpdatedDate": "01-12-17", 
    "CreatedDate": "01-11-17", 
    "_rid": "KFokAIrg-QABAAAAAAAAAA==", 
    "_self": "dbs/KFokAA==/colls/KFokAIrg-QA=/docs/KFokAIrg-QABAAAAAAAAAA==/", 
    "_etag": "\"00002d00-0000-0000-0000-59ef0f7f0000\"", 
    "_attachments": "attachments/", 
    "_ts": 1508839295 
} 

Antwort

0

Sie benötigen eine benutzerdefinierte Funktion, um dies zu tun. Registrieren:

function getEmailAndRoles(doc) { 
    var result = { Email: doc.Email } 
    result.Roles = [] 
    for(idx = 0; idx < doc.OrgRoles.length; idx++) { 
    result.Roles.push(doc.OrgRoles[idx].RoleDesc) 
    } 
    return result; 
} 

nennen Dann

SELECT udf.getEmailAndRoles(c) 
FROM c 
WHERE c.Email = "[email protected]" 
+0

gibt es keinen Vorteil davon db im Kosmos zu tun und nicht nur überlassen es Client-Anwendung? Nehmen wir als Argument an, dass die Dokumentgröße klein ist, so dass der Unterschied im Netzwerkverkehr vernachlässigbar ist. –

+0

Es gibt keinen Vorteil in UDF vs. clientseitigem Code, es sei denn, es gibt keinen Netzwerkverkehrsunterschied. In diesem Fall ist der clientseitige Code besser. –

Verwandte Themen