子文档 vs Mongoose populate

4
我有以下场景:
用户可以登录到一个网站。用户可以添加/删除投票(一个包含两个选项的问题)。任何用户都可以选择其中之一来表达对投票的意见。
考虑以上情况,我有三个模型- UsersPollsOptions。它们按依赖顺序如下: 选项架构
var optionSchema = new Schema({
  optionName : {
    type : String,
    required : true,
  },
  optionCount : {
    type : Number,
    default : 0
  }
});

投票架构

var pollSchema = new Schema({
  question : {
    type : String,
    required : true
  },
  options : [optionSchema]
});

用户架构:父级架构

var usersSchema = new Schema({
  username : {
    type : String,
    required : true
  },
  email : {
    type : String,
    required : true,
    unique : true
  },
  password : String,
  polls : [pollSchema]
});

我该如何在这些文档之间实现上述关系?什么是Mongoose population?它与子文档有什么不同?我应该选择子文档还是使用Mongoose population?


如果您有任何问题,请在回答下面提出。如果这篇文章对您有所帮助,我将不胜感激,希望您能给予评价;) - kkochanski
1个回答

7
由于MongoDb没有像关系数据库那样的联接,因此填充(population)就像是隐藏的联接一样。这意味着当您有一个用户模型并且您将填充投票模型时,mongoose会执行以下操作:
  1. 获取用户
  2. 通过存储在用户文档中的ObjectIds获取相关的投票
  3. 将获取的投票文档放入用户文档中
当您将用户设置为文档并将投票设置为子文档时,这只意味着您将整个数据放入单个文档中。一方面,这意味着要获取用户投票,mongoose不需要运行两个查询(它只需要获取用户文档,因为投票数据已经存在)。
但是什么更好选择?这取决于情况。
如果您的投票文档将在其他文档中引用(您需要从用户、A、B、C文档中访问投票文档),最好进行填充,但并不确定。填充的优点是,当您需要更改一些投票字段时,您无需在每个引用该投票文档的文档中更改数据(因为它将是子文档)-在这种情况下,在用户、A、B、C文档中,您只需更新投票文档即可。正如您所看到的,这很好。我说过,在这种情况下填充是否更好,因为我不知道您需要检索投票数据的方式。如果您以错误的方式存储数据,则会出现性能问题或遇到一些易于数据获取的问题。
子文档是存储数据的基本方法。当投票仅涉及到用户时,这非常棒。有性能优势- mongoose只需要执行一个查询,而不是填充中的两个,没有先前提醒的更新缺点,因为您只在一个地方存储投票数据,因此无需更新其他文档。
基本上MongoDb是为了大多数使用子文档而创建的。事实上,它只是非关系型数据库。因此,在大多数情况下,我更喜欢使用子文档。我无法回答哪种方式在您的情况下更好,因为我不确定您的DB完整的外观以及您想要检索数据的方式。
官方文档中有一些有用的信息:

请看一下。

编辑

由于我更喜欢轻松获取数据,关注性能,并且知道MongoDb中的数据冗余是很常见的,因此我选择将这些数据存储为子文档。


谢谢您的所有解释,非常有帮助。希望通过实践能够更好地理解。 - chirag_lad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接