递归查询DocumentDB中的所有链接文档

时间:2016-03-01 21:53:23

标签: azure-cosmosdb nosql

我们构建了一个Document架构,其中作业文档由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"
}

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

1 个答案:

答案 0 :(得分:1)

DocumentDB无法在单个查询中执行此操作。当然,您可以通过多次往返递归地走树。您甚至可以在一次往返于您编写的存储过程的往返过程中执行此操作。

但是,我发现在NoSQL数据库中快速检索的层次结构(树)建模的最佳方法是包含materialized path的数组。看看这个例子:

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中的“项目4”项目2,项目2仍然将项目1作为其父项。项目5是项目1的另一个根项目;而“D”是项目6中的“项目6”。

现在发送一个这样的查询:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 1)

它将返回文档A,B和D.尝试:

SELECT * FROM c WHERE ARRAY_CONTAINS(c.hierarchy, 2)

它只返回文件A和B。

但需要注意的一点是,我不知道这种方法在DocumentDB中的表现如何,我认为它不允许在数组字段上使用索引。也许其中一个监控Stack Overflow的DocumentDB产品经理可以加入其中。

此方法通常用于NoSQL数据库,如CouchDBMongoDB (combining materialized path and array of ancestors),甚至支持数组类型的SQL数据库,如Postgres