【问题标题】:MongoDB Realm - Is there a way to share documents between partitions to avoid duplication?MongoDB Realm - 有没有办法在分区之间共享文档以避免重复?
【发布时间】:2021-03-21 15:34:34
【问题描述】:

有没有办法在分区之间共享文档以避免重复?

如果我有枚举数据Message Status(已发送、发送、失败、无法投递等),我必须为每个分区制作一份副本,而不是让所有分区共享相同的状态。

为清楚起见的示例:
用户A 可以访问分区1,用户B 可以访问分区2。用户A 要访问枚举数据,它需要与分区键1 一起存在。与用户B 相同,他需要一份带有分区键2 的枚举文档的副本,因为他无法访问带有分区1 的现有文档。所以数据最终会被复制。

【问题讨论】:

  • “分区”是什么意思?它在MongoDB中不存在,它来自关系RDMBS。
  • 抱歉,我从未使用过 MongoDB Atlas。无论如何,我不明白你的问题,你的问题是什么?您的文档是什么样子的?分区键是什么?
  • 我的分区键是一个位置ID,用户可以访问不同的位置。问题是,我必须为每个位置 ID(分区)复制消息状态(以及几乎任何类似 enum 的数据)。这是一个更清楚的示例 - 位置12,我需要两份sent 消息状态副本,一份带有分区键1,另一份带有2。如果我只有一个位置,其他位置将无法访问该消息状态。
  • 请用演示问题的代码更新问题,而不是描述您的问题。此外,不清楚为什么要复制数据或无法访问多个分区中的数据;这是一项常见的任务。请更新并澄清问题并花点时间,请花点时间查看How do I ask a good question?How to create a Minimal, Complete, and Verifiable example

标签: mongodb realm mongodb-atlas mongodb-realm


【解决方案1】:

从另一个地方得到了答案:

"不,此时一个Realm Object(存储在MongoDB中时翻译成一个文档)只能属于单个分区:如果需要从多个分区中引用同一条数据,两种模式你可以关注:

  • 如果数据很小,您可以使用 EmbeddedObject(或它们的列表),虽然由于重复而使用更多空间,但可以更快地访问数据本身,而无需往返数据库。如果您在谈论枚举,这看起来是一个不错的选择:Obj​​ectId 无论如何都会占用一些数据。

  • 使用公共数据定义另一个分区,并在客户端上为其打开一个单独的特定领域:您必须手动处理关系,即您可以将 ObjectId 存储在您的主领域中,但需要查询第二个实际对象。仅当公共数据足够复杂以证明开销合理时才可能值得。”

【讨论】:

  • 这个答案似乎与问题无关。 partition 不是数据的分隔。具有不同分区的对象存在于同一个 Atlas 集合中,因此不存在“分区之间共享”的概念;可以随时访问分区。例如;假设消息具有 _partitionKey 属性“消息”。用户 A 需要更新消息状态,以便他们使用分区“消息”连接到 Realm,然后更新消息状态。然后用户 B 需要更新相同的消息,以便他们连接到消息领域并更新消息。有意义吗?
  • 希望这更清楚 - 用户 A 有权访问分区 1,用户 B 有权访问分区 2。现在假设您有任何枚举数据,例如提到的消息状态。要使用户 A 能够访问该枚举数据,它需要与分区键 1 一起存在。与用户 B 一样,他需要一份带有分区键 2 的枚举文档的副本,因为他无法访问带有分区 1 的现有文档。因此,它最终会针对不同的分区重复。
  • 我理解您在评论中所说的话,但这并不准确。只要安全允许,任何用户都可以随时访问任何分区。虽然有一个由 Int 支持的Realm enum,但它实际上只是一个原始值。因此,用户 A 和用户 B 都可以随时将枚举数据写入其分区(1、2、3 等),不受限制。此外,任何用户都可以根据需要访问或访问任何其他分区 - 无需仅访问一个分区。
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多