Azure cosmosdb 递归查询CosmosDB中的所有链接文档
我们构建了一个文档模式,其中作业文档由Id属性唯一标识,并通过ParentJobId属性表示它们到父级的链接。 例如: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
{
"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数据库,如