2017-10-13 48 views
0

想象我有数据在宇宙DocumentDB“全部/任何”功能

[ 
    { 
     "id": "FCEC01CD-A6E9-4DEA-8DD5-89711B5B05A1", 
     "sub": [ 
      { 
       "id": 1, 
       "v": false 
      }, 
      { 
       "id": 2, 
       "v": false 
      } 
     ] 
] 

,我想查询所有的ID具有所有(sibbeling),具有V“子”项目=假 什么查询语法会工作? (ARRAY_CONTAINS不起作用,因为这会给出'任何'结果)

谢谢!

回答

1

您需要一个用户定义的函数。

function arrayAllMatch(arr) { 
    for(i=0; i < arr.length; i++) { 
    if (arr[i].v === true) { 
     return false; 
    } 
    } 

    return true; 
} 

然后在查询中调用(还包括ARRAY_CONTAINS,因为它可以使用索引来减少调用的UDF数):

SELECT * 
FROM c 
WHERE ARRAY_CONTAINS(c.sub, {"v" : false }, true) 
AND udf.arrayAllMatch(c.sub) 
+0

谢谢,这肯定会工作。但不适用于我的动态CosmosDB SQL生成器,它可能没有授权将udf上传到Cosmos (在nuget ADCCure.Azure.Documents.OData.Sql中) –