我的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]
这"感觉"像聚合物,但我似乎无法理解它。有什么想法吗?
我知道我可以依次加载每个文档并进行迭代。我希望通过查询来执行此操作,并避免依次加载每个文档的费用。
答案 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]