【问题标题】:Sub documents vs Mongoose population子文档与猫鼬种群
【发布时间】:2016-12-17 04:59:41
【问题描述】:

我有以下情景:

用户可以登录网站。用户可以添加/删除投票(一个有两个选项的问题)。任何用户都可以通过选择任何选项对投票发表意见。

考虑到上述情况,我有三个模型 - Users Polls Options 。它们如下,按依赖顺序排列:

选项架构

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 种群。

【问题讨论】:

  • 如果您有任何问题,请继续 - 请在下方回答。如果对您有帮助,我将不胜感激;)

标签: node.js mongodb mongoose crud


【解决方案1】:

由于 MongoDb 没有将连接作为关系数据库,因此填充类似于隐藏连接。这只是意味着当您拥有该用户模型并且您将填充投票模型时,猫鼬会执行以下操作:

  1. 获取用户
  2. 通过存储在用户文档中的 ObjectId 获取相关民意调查
  3. 将获取的投票文档放入用户文档中

当您将 User 设置为文档并将 Polls 设置为子文档时,这仅意味着您会将整个数据放在单个文档中。一方面它意味着要获取用户投票,猫鼬不需要运行两个查询(它只需要获取用户文档,因为投票数据已经存在)。

但是选择什么更好呢?这取决于具体情况。

如果您的投票文档将在其他文档中引用(您需要从文档 User、A、B、C 访问投票 - 填充它可能会更好,但不确定。填充的好处是事实,当您将需要更改一些民意调查字段,您不需要更改引用该民意调查文档的每个文档中的数据(因为它将是一个子文档) - 在这种情况下是文档用户,A,B,C -您只会更新民意调查文档。如您所见,这很好。我告诉过它不确定在这种情况下填充是否会更好,因为我不知道您需要如何检索您的民意调查数据。如果您将数据存储错误方式,您将遇到性能问题或在轻松获取数据时遇到一些问题。

子文档是存储数据的基本方式。当民意调查仅指用户时,这很棒。有性能优势 - mongoose 需要执行一次查询而不是人口中的两次查询,并且没有之前提醒的更新缺点,因为您仅将 Polls 数据存储在单个位置,因此无需更新其他文档。

基本上,创建 MongoDb 主要是为了使用子文档。事实上,它只是非关系数据库。所以在大多数情况下,我更喜欢使用子文档。我无法回答在您的情况下哪种方式会更好,因为我不确定您的数据库(完整方式)以及您希望如何检索数据。

官方文档中有一些有用的信息:

看看那个。

编辑

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

【讨论】:

  • 感谢您的所有解释。它有帮助。希望,我会通过经验更好地理解。
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 2019-09-13
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2015-10-01
  • 2018-02-10
相关资源
最近更新 更多