查询以获取另一个引用的所有 Cosmos DB 文档

Age*_*dum 2 azure azure-cosmosdb azure-cosmosdb-sqlapi

假设我有以下 Cosmos DB 容器,其中包含可能的文档类型分区:

{
  "id": <string>,
  "partitionKey": <string>, // Always "item"
  "name": <string>
}
Run Code Online (Sandbox Code Playgroud)
{
  "id": <string>,
  "partitionKey": <string>, // Always "group"
  "items": <array[string]>  // Always an array of ids for items in the "item" partition
}
Run Code Online (Sandbox Code Playgroud)

我有一个“组”文档的 ID,但我没有该文档本身。我想做的是执行一个查询,为我提供“组”文档引用的所有“项目”文档。

我知道我可以执行两个查询:1)检索“group”文档,2)在“item”分区上使用 IN 子句执行查询。

由于除了获取 id 列表之外,我不关心“组”文档,因此是否可以构造一个查询来仅使用“组”文档 id 来获取我想要的所有“项目”文档?

Dav*_*gon 5

您需要执行两个查询,因为单独的文档之间没有联接。尽管支持子查询,但当前仅支持相关子查询(这意味着内部子查询引用外部查询中的值)。您需要的是不相关的子查询。

请注意,即使您不需要所有文档group,也不需要检索整个文档。您可以仅投影items属性,然后可以在第二个查询中使用类似array_contains(). 就像是:

SELECT VALUE g.items
FROM g
WHERE g.id="1"
AND g.partitionKey="group"

SELECT VALUE i.name
FROM i
WHERE array_contains(<items-from-prior-query>,i.id)
AND i.partitionKey="item"
Run Code Online (Sandbox Code Playgroud)

文档页面阐明了两种子查询类型并仅支持相关子查询。