MongoDB:不在不同文档间复制子文档id的原因?

MongoDB:不在不同文档间复制子文档id的原因?,mongodb,mongoose,Mongodb,Mongoose,我有一个MongoDB模式设计,它在同一集合的不同文档中嵌入了一个重复的子文档(同样的ObjectId): 文档看起来像: {"inbox": { "_id": ..., "conversations": [ {"_id": ..., "messages": [{"_id": ..., "body": ...}]

我有一个MongoDB模式设计,它在同一集合的不同文档中嵌入了一个重复的子文档(同样的ObjectId):

文档看起来像:

{"inbox": 
    {   "_id": ...,
        "conversations": [
             {"_id": ...,
              "messages": [{"_id": ...,
                            "body": ...}]
                         ]
    }
}
在收件箱集合中,每当两个人进行对话时,我都会将对话的副本推送到两个收件箱


我的计划是使收件箱的读取保持简单,并允许多文档更新以向所有具有相同会话id的会话写入消息。这似乎如预期的那样工作,但我是否缺少允许在集合中的不同文档之间复制子文档ObjectId的缺点?

请看以下内容:@inspired Thanks,这强化了我为什么采用这种方法,但我最关心的是这些ObjectId是相同的。我知道对象Id应该是唯一的,所以我不确定这意味着什么。如果存在多个引用,有时需要在文档中有重复的对象Id。我想不出为什么在这种情况下具有相同ObjectId的子文档会有害。在嵌入这种样式时,请记住潜在的增长。这里有关于切分的信息,它讨论了用于消息传递的模型:@ChristianDavis这是一个由三部分组成的原因。首先,数组的深度限制为1,因此几乎不可能对更深数组中的特定项进行任何更新。第二,在多个地方拥有相同的数据会导致不一致。这是注定要发生的。基于第一点,让检查和类似cron的作业来管理最终的一致性变得更加困难。最后,文档有大小限制(16mb)。对于两个可能无限大的数组(),您将在某个时候找到它。它不可缩放。@ChristianDavis要完成我过长的回复,您的文档可以轻松切换为3个集合,其中对话有指向收件箱的指针,邮件有指向对话的指针(如果需要,还有收件箱)。如果索引正确,您的查询可能会保持不变,并且您消除了像我这样的人在查看数组时看到的所有缩放焦虑:)我将放入数组中的内容通常是可枚举的,并且有明确定义的限制,例如兄弟姐妹、最后5个密码、使用的语言