Azure Cosmos DB 多类型文档查询

Azure Cosmos DB multi-type documents query

我正在尝试通过 SQL API 查询 Cosmos DB。我有一个简单的数据模型,在同一个容器中包含不同类型的文档(因为它们彼此相关)并且我正在为每个定义文档类型的文档使用自定义 typetutorial。 这是我的文档的样子:

document a:
{
   "id": 1,
   "b_id": 2,
   "c_id": 3,
   "foo": "bar",
   "type": "a"
}
document b:
{
   "id": 2,
   "baz": "qux",
   "type": "b"
}
document c:
{
   "id": 3,
   "quux": "quuz",
   "type": "c"
}

我知道 join synatx 在 Cosmos DB 中是不同的,只能在同一个文档中使用。我正在尝试找到一种方法来检索文档 a 及其从文档 bc:

中检索到的所有属性
{
   "id": 1,
   "foo": "bar",
   "baz": "qux",
   "quux": "quuz"
}

是否有可能以一种有效的方式?如果没有,我正在考虑在写入 Cosmos 之前规范化数据。类似于:

{
   "id": 1,
   "b" : { "baz": "qux" },
   "c" : { "quux": "quuz" }
}

但这样我必须在每个文档中写下整个 bc,同时从容量的角度来看似乎对它们的引用使它更有效率。

你这里的数据模型对于你这里的数据类型来说并不正确。您通常只在存在 many-to-many 关系时才引用数据。即使这样,每个文档也只能存储一个关系。此处使用您的数据模型检索相关数据的唯一方法是查询容器两次。

这里的数据是 one-to-many(或 one-to-few),其中引用了单个文档中的多个文档。

在这些情况下,如果关系是 one-to-few,您可以或应该嵌入子项。如果它相当大或无界 one-to-many,那么您应该对数据建模,以便您可以检索具有共同 属性 和值的所有相关项目。

在你这里的场景中,如果这只是少量的子文档,我会嵌入它们。然后,如果您已对数据建模,从而知道数据的分区键和 ID,则可以使用点读取 ReadItemAsync() 而不是使用查询来非常有效地检索此数据。这既超快又非常高效。