Azure Cosmos DB 多类型文档查询
Azure Cosmos DB multi-type documents query
我正在尝试通过 SQL API 查询 Cosmos DB。我有一个简单的数据模型,在同一个容器中包含不同类型的文档(因为它们彼此相关)并且我正在为每个定义文档类型的文档使用自定义 type
键 tutorial。
这是我的文档的样子:
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
及其从文档 b
和 c
:
中检索到的所有属性
{
"id": 1,
"foo": "bar",
"baz": "qux",
"quux": "quuz"
}
是否有可能以一种有效的方式?如果没有,我正在考虑在写入 Cosmos 之前规范化数据。类似于:
{
"id": 1,
"b" : { "baz": "qux" },
"c" : { "quux": "quuz" }
}
但这样我必须在每个文档中写下整个 b
和 c
,同时从容量的角度来看似乎对它们的引用使它更有效率。
你这里的数据模型对于你这里的数据类型来说并不正确。您通常只在存在 many-to-many 关系时才引用数据。即使这样,每个文档也只能存储一个关系。此处使用您的数据模型检索相关数据的唯一方法是查询容器两次。
这里的数据是 one-to-many(或 one-to-few),其中引用了单个文档中的多个文档。
在这些情况下,如果关系是 one-to-few,您可以或应该嵌入子项。如果它相当大或无界 one-to-many,那么您应该对数据建模,以便您可以检索具有共同 属性 和值的所有相关项目。
在你这里的场景中,如果这只是少量的子文档,我会嵌入它们。然后,如果您已对数据建模,从而知道数据的分区键和 ID,则可以使用点读取 ReadItemAsync()
而不是使用查询来非常有效地检索此数据。这既超快又非常高效。
我正在尝试通过 SQL API 查询 Cosmos DB。我有一个简单的数据模型,在同一个容器中包含不同类型的文档(因为它们彼此相关)并且我正在为每个定义文档类型的文档使用自定义 type
键 tutorial。
这是我的文档的样子:
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
及其从文档 b
和 c
:
{
"id": 1,
"foo": "bar",
"baz": "qux",
"quux": "quuz"
}
是否有可能以一种有效的方式?如果没有,我正在考虑在写入 Cosmos 之前规范化数据。类似于:
{
"id": 1,
"b" : { "baz": "qux" },
"c" : { "quux": "quuz" }
}
但这样我必须在每个文档中写下整个 b
和 c
,同时从容量的角度来看似乎对它们的引用使它更有效率。
你这里的数据模型对于你这里的数据类型来说并不正确。您通常只在存在 many-to-many 关系时才引用数据。即使这样,每个文档也只能存储一个关系。此处使用您的数据模型检索相关数据的唯一方法是查询容器两次。
这里的数据是 one-to-many(或 one-to-few),其中引用了单个文档中的多个文档。
在这些情况下,如果关系是 one-to-few,您可以或应该嵌入子项。如果它相当大或无界 one-to-many,那么您应该对数据建模,以便您可以检索具有共同 属性 和值的所有相关项目。
在你这里的场景中,如果这只是少量的子文档,我会嵌入它们。然后,如果您已对数据建模,从而知道数据的分区键和 ID,则可以使用点读取 ReadItemAsync()
而不是使用查询来非常有效地检索此数据。这既超快又非常高效。