在Documentdb中的Array中选择特定值

时间:2015-12-07 09:53:54

标签: azure azure-cosmosdb

我们说我有以下收藏品:

paidamount

我想查询以下结果:

 [{"id": "1123",
   "columns": [
         { "columnId": "1", "value":3},
         { "columnId": "2", "value":2 },
         { "columnId": "3", "value":7 }
         ]
   },
   {"id": "1124",
   "columns": [
         { "columnId": "1", "value":5},
         { "columnId": "2", "value":6 },
         { "columnId": "3", "value":2 }
         ]
   },
]

我试过这个查询

 [{"id": "1123",
   "columns": [
         { "columnId": "1", "value":3},
         { "columnId": "2", "value":2},
         ]
   },
   {"id": "1124",
   "columns": [
         { "columnId": "1", "value":5},
         { "columnId": "2", "value":6},
         ]
   },
]

但是它的输出看起来像我想要的那样:

SELECT c.id, [f] FROM c JOIN f IN c.columns WHERE f.columnId IN ('1','2')

1 个答案:

答案 0 :(得分:1)

这是一个用户定义的函数(UDF),它将公开JavaScript的Array.slice()方法:

function(array, begin, end) {
  return array.slice(begin, end);
}

如果您在针对此类示例文档的查询中使用它,则会得到输出要求:

SELECT c.id, udf.slice(c.columns, 0, 1) as columns FROM c

您也可以在JavaScript language-integrated query内使用切片运算符,但只能在服务器端SDK中使用,以便在sprocs或触发器中使用。

一般来说,我不喜欢DocumentDB的自连接功能来格式化输出。恕我直言,UDF更容易编写,消费它们的查询更容易理解。

唯一的缺点是将UDF添加到每个集合中的额外负担,但我是node.js包documentdb-utils的作者,其中我有自动加载目录中找到的所有sproc的功能您提供的列表中的每个集合。我现在为UDF添加相同的内容。

请注意,documentdb-utils的文档稍微落后于我在过去几天所做的主要重构,但测试显示了如何使用它的大部分功能。今天我会把它弄好,并添加加载所有UDF的功能,就像它加载所有的sprocs一样。