当前位置: 首页 > 知识库问答 >
问题:

Cosmos DB:如何使用DocumentDB API在单独的集合中引用文档

何高旻
2023-03-14

我是使用DocumentDB API的Azure Cosmos DB新手。我计划对我的数据进行建模,以便一个文档引用另一个文档。这非常简单,如建模文档数据中所述。但是,我还想将相关文档分成不同的集合(此决定与数据的分区方式有关)。

2017年7月24日编辑:回复关于我为什么选择使用单独集合的评论:单独集合的理由主要归结为分区键和读/写优先级。由于集合中的所有文档都需要某个分区键,因此将所选分区键不属于的文档分开是有意义的。经过对选项的大量权衡,我确定的分区键可以优化写入速度并将数据均匀分布在分片中——但不幸的是,它在逻辑上不属于我的“元数据”文档。由于元数据和度量值之间有着千丝万缕的关系,我选择在度量值中使用对元数据的引用,而不是嵌入。由于元数据很少(或永远不会)附加到每个度量值中,我认为额外往返html" target="_blank">数据库的费用非常低。

由于引用是数据库未验证的“弱链接”,因此是否可以存储其他信息,如集合名称?也就是说,我们可以使用一种路径,而不仅仅是字符串id?

Metadata document in collection "Metadata":
{
  "id": "metadata1",
  ...
}

Measurement document in collection "Measurements":
{
  "id": "measurement1",
  "metadata-id" : "../Metadata/metadata1",
  ...
}

然后,当我解析应用程序/脚本中的数据时,我知道要查询哪些集合和文档。

最后,我假设还有其他/更好的方法可以做到这一点,我欢迎您的建议(例如,下划线,而不是斜杠,使用符号来表示集合,如$Metadata等)。或者,我对跨越集合的关系的使用是一种代码气味吗?

谢谢!

编辑:对于落选者,你能解释一下你的理由吗?我的问题是不知情,不清楚,还是没用?为什么?

共有2个答案

江天宇
2023-03-14

你想做的事情是可行的。你用的约定不是特别重要,只要你能搞清楚引用就行。但是请记住,使用这种类型的“关系”会相当慢,因为您需要从一个集合中获取所有文档,然后在一个单独的查询中获取相关的文档。它会对您的应用程序产生严重影响。

另一种可能性是优化您的数据以供读取:您可以将元数据文档嵌入到另一个文档中。您的数据将被复制,因此如果您更新这些文档,您将不得不在两个集合中更新它们,但您可能会比您阅读的频率更低(可能,如果不是这样,这种设置会更糟)。

您的文档将如下所示:

Metadata document in collection "Metadata":
{
  "id": "metadata1",
  ...
}

Measurement document in collection "Measurements":
{
  "id": "measurement1",
  "metadata" : {
      "id": "metadata1",
      ...
  },
  ...
}
公冶同
2023-03-14

您的想法是错误的,并且会为不必要的“优化”带来更多成本,因为您是按每个集合级别计费的。您应该做的是选择一个更通用的分区键。类似于key分区键。这里的权衡是您需要确保在您的客户端应用程序中填充所有文档上的此属性(这可能会导致重复的值,但最终没问题)。您可以继续使用您最初为测量文档选择的任何值,并为您的元数据文档设置不同的值。

我在这里的其他一些答案中广泛地写了关于这一点的文章,我相信这是关于有效和大规模使用Cosmos的最大误解之一。在许多 Cosmos 示例中,他们谈论选择分区密钥(如 deviceId邮政编码)这无济于事,这意味着您正在处理同构文档。

请参阅我在 documentdb 中回答的有关同构与异构的这个问题。这种模式的最大论点是在 Cosmos 中新增了图形 API,这需要在单个集合中拥有许多不同类型的实体,并且完全支持您描述的用例减去额外的集合。显然,在处理异构类型时,所有文档上都不会存在适合分区键的单个属性,这就是为什么您需要通用的原因。

 类似资料:
  • 因此,我想操作问题可以归结为:是否有任何方法可以通过MongoDb API将所需的partitionKey传递给CosmosDb,从而成功创建集合?

  • 问题内容: 我尝试了以下行: 但是Netbeans 7拒绝此操作,并显示错误消息。 我已将“源/二进制”格式设置为“ JDK 7”,将平台设置为“ JDK 1.7”,我还需要做其他事情吗? 问题答案: 正如这个问题所讨论的,Java 7和Java 8都不支持集合文字:ProjectCoin的集合增强功能是否将在JDK8中使用? 如果只需要不可变的集合,则可以使用Google的Guava库。,并且具

  • 我见过许多在主类中编写AnimationTimer和KeyListener的示例,但在另一个类中没有看到。 我尝试过如何在“VolleyController”中为JavaFX编写一个KeyListener,但我不知道为什么它不起作用。 首先,我使用KeyEvent移动图像,就像第一个代码一样。第三个代码是我的主类。我想重写这些方法来移动图像,就像第二个代码一样。 但是我遇到了第二个代码中写的一些错

  • 问题内容: 首先,我经历了相关的问题..尚未找到任何答案..我正在使用此代码显示消息 我该如何做这项工作,因为此回声内的任何引号都会破坏该语句… 问题答案: 可以使用反斜杠对引号进行转义,也可以使用双引号来指定字符串。

  • 是否可以将在集群节点上运行的服务注册为观察者,以便在th集群中跨多个cosmos db帐户为文档集合更改提要? https://docs.microsoft.com/en-us/azure/cosmos-db/serverless-computing-database 如何通过changefeed处理器库触发服务APIendpoint?或者,如何将集群节点上运行的服务注册为观察者,以便跨集群中的多

  • 在过去的两天里,我一直在学习React,我在理解URL参数方面遇到了困难。 假设我想要一个路由。路线的定义如下: 现在我希望在另一个文件中定义的对象能够使用值。我该怎么做?我已经找到了关于路由url参数的教程,但没有一个解释如何实现这一点。 下面是我的视图现在的样子: 在哪里可以获得详细信息中的?我试过: 但是,未定义。