2017-10-24 2 views
0

私はAzure Cosmos DBを以下の文書で作成しました。 この場合、[email protected]の電子メールには3つの役割があります。どのようにして電子メールと3つの役割を含むリストを返すことができますか? 私はちょうど次のとおりですが、それは重複した電子メールアドレスを返します。query Azure Cosmos DBが重複を返さないようにする

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 
} 

答えて

0

これを行うには、ユーザー定義関数が必要です。登録:

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

そして、コスモスデシベルでこれを行うのいずれかの利点がある

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

呼び出し、単にクライアントアプリにそれを残していませんか?議論のために、文書サイズが小さいので、ネットワークトラフィックの違いが無視できると仮定することができます。 –

+0

ネットワークトラフィックの違いがない限り、UDFとクライアント側コードの利点はありません。この場合、クライアント側のコードを使う方がよいでしょう。 –

関連する問題