Azure cosmosdb 递归查询CosmosDB中的所有链接文档

Azure cosmosdb 递归查询CosmosDB中的所有链接文档,azure-cosmosdb,nosql,Azure Cosmosdb,Nosql,我们构建了一个文档模式,其中作业文档由Id属性唯一标识,并通过ParentJobId属性表示它们到父级的链接。 例如: { "Type": "Request", "StateName": "Success", "id": "4365b7ec-6eee-468a-94f6-ab65d6434611", "ParentJobId": null }, { "Type": "Machine", "StateName": "ChildJobFailed", "id": "270

我们构建了一个文档模式,其中作业文档由Id属性唯一标识,并通过ParentJobId属性表示它们到父级的链接。 例如:

{
  "Type": "Request",
  "StateName": "Success",
  "id": "4365b7ec-6eee-468a-94f6-ab65d6434611",
  "ParentJobId": null
},
{
  "Type": "Machine",
  "StateName": "ChildJobFailed",
  "id": "27040208-add5-97e4-6bd2-d991de73c9b5",
  "ParentJobId": "4365b7ec-6eee-468a-94f6-ab65d6434611"
},
{
  "Type": "Application",
  "StateName": "Error",
  "id": "7ef36990-c321-81dd-a0c7-3b04fd64c86f",
  "ParentJobId": "27040208-add5-97e4-6bd2-d991de73c9b5"
}

如何查询与根父作业相关的所有文档

在CosmosDB中,无法在单个查询中实现这一点。当然,您可以通过多次往返递归地遍历树。您甚至可以通过一次往返来访问您编写的执行多个请求的存储过程

然而,我发现在NoSQL数据库中为快速检索建立层次结构(树)模型的最佳方法是作为包含。看看这个例子:

documents = [
  {id: 'A', hierarchy: [1, 2, 3]},
  {id: 'B', hierarchy: [1, 2, 4]},
  {id: 'C', hierarchy: [5]},
  {id: 'D', hierarchy: [1, 6]},
]
“A”在“项目3”中,其父项为项目2,其父项为项目1。“B”是“在”项目4中,其父项目是项目2,其父项目仍然是项目1。项目5是与项目1类似的另一个根项目;“D”在“项目6”中,项目6是项目1的子项目

现在发送如下查询:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 1)
它将返回文档A、B和D。请尝试:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 2)
它将只返回文件A和B

不过需要注意的是,我不知道这种方法在DocumentDB中的性能如何,我认为DocumentDB不允许对数组字段进行索引。也许监控堆栈溢出的DocumentDB产品经理之一可以插话


这种方法通常用于NoSQL数据库,如和,甚至支持数组类型的SQL数据库。

在CosmosDB中,无法在单个查询中实现这一点。当然,您可以通过多次往返递归地遍历树。您甚至可以通过一次往返来访问您编写的执行多个请求的存储过程

然而,我发现在NoSQL数据库中为快速检索建立层次结构(树)模型的最佳方法是作为包含。看看这个例子:

documents = [
  {id: 'A', hierarchy: [1, 2, 3]},
  {id: 'B', hierarchy: [1, 2, 4]},
  {id: 'C', hierarchy: [5]},
  {id: 'D', hierarchy: [1, 6]},
]
“A”在“项目3”中,其父项为项目2,其父项为项目1。“B”是“在”项目4中,其父项目是项目2,其父项目仍然是项目1。项目5是与项目1类似的另一个根项目;“D”在“项目6”中,项目6是项目1的子项目

现在发送如下查询:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 1)
它将返回文档A、B和D。请尝试:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 2)
它将只返回文件A和B

不过需要注意的是,我不知道这种方法在DocumentDB中的性能如何,我认为DocumentDB不允许对数组字段进行索引。也许监控堆栈溢出的DocumentDB产品经理之一可以插话

这种方法通常用于NoSQL数据库,如,甚至支持数组类型的SQL数据库,如