Azure Cosmos数据库查询:如何跨文档连接数组?

时间:2017-11-06 19:21:58

标签: azure-cosmosdb

我的CosmosDB数据库中的文档都有一个像这样的数组元素:

{
    id: 1,
    list: [1, 2, 3]
},
{
    id: 2,
    list: [2, 3, 4]
},
...

我想要一个连接数组的查询" list"在所有文档中(理想情况下,我喜欢UNIQUE连接,但我可以从所有文档开始)。

我想要的结果是:

[1, 2, 3, 2, 3, 4]

甚至更好:

[1, 2, 3, 4]

这"感觉"像聚合物,但我似乎无法理解它。有什么想法吗?

我知道我可以依次加载每个文档并进行迭代。我希望通过查询来执行此操作,并避免依次加载每个文档的费用。

2 个答案:

答案 0 :(得分:2)

使用SQL查询

您可以通过使用value关键字将结果值合并回单个数组,从数组中选择单个值:

SELECT value i
FROM c
join i in c.list

请注意,这会返回单个数组中的所有值,但遗憾的是包含重复项。

据我所知,目前没有服务器端不同的功能。但是"Provide support for DISTINCT"要求获得1k +票,所以我相信在将来的某个时候它是可能的。如果这是你关心的事情,那么就去投票吧。

使用SP

在服务器端获取唯一列表的另一种方法是在documentDB集合中使用存储过程:

function GetUniqueItems() {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT value i FROM c join i in c.list',
        function (err, feed, options) {
            if (err) throw err;

            var uniqueArray = feed
                .filter(function(item, pos) { return feed.indexOf(item) == pos;});
            getContext().getResponse().setBody(uniqueArray);
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

您可以阅读更多如何利用DocumentDB服务器端编程 "Azure Cosmos DB server-side programming: Stored procedures, database triggers, and UDFs"

答案 1 :(得分:1)

您可以使用'Distinct',现在受支持:

SELECT distinct value i FROM c join i in c.list

结果为: [1、2、3、4]

相关问题