子文件与Mongoose人口

时间:2016-08-10 17:13:03

标签: node.js mongodb mongoose crud

我有以下服装: -

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

考虑到上述情况,我有三个模型 - Users Polls Options。它们如下 -

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

});

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

});

var optionSchema = new Schema({
optionName : {
    type : String,
    required : true,
},
optionCount : {
    type : Number,
    default : 0
}

});

如何在这些文档之间实现上述关系。猫鼬人口有什么特别之处?它与子文档有什么不同?我应该使用子文档还是应该使用Mongoose人口。

1 个答案:

答案 0 :(得分:4)

由于MongoDb没有作为关系数据库加入,所以人口就像隐藏连接一样。这只是意味着当你拥有那个用户模型并且你将填充Poll Model时,mongoose会做这样的事情:

  1. 获取用户
  2. 通过存储在用户文档
  3. 中的ObjectIds获取相关的民意调查
  4. 将提取的民意调查文件放入用户文档
  5. 当您将User设置为文档并将Polls设置为子文档时,这只意味着您将整个数据放在单个文档中。一方面意味着要获取用户轮询,mongoose不需要运行两个查询(它只需要获取用户文档,因为已经存在轮询数据)。

    但最好选择什么?这只取决于案例。

    如果您的民意调查文件将在其他文件中提及(您需要访问来自文档用户,A,B,C的民意调查 - 最好填充它,但不能确定。填充的好处是事实,即您将需要更改一些民意调查字段,您不需要在每个引用该民意调查文档的文档中更改该数据(因为它将是一个子文档) - 在这种情况下,在文档User,A,B中, C - 你只会更新民意调查文件。正如你所看到的那样好。我告诉它不确定在这种情况下填充是否会更好,因为我不知道你需要怎样检索您的民意调查数据。如果您以错误的方式存储数据,您将遇到性能问题或在轻松获取数据时遇到一些问题。

    子文档是存储数据的基本方法。当民意调查只涉及用户时,这很棒。有性能优势 - mongoose需要一个查询而不是两个查询,因为你只在一个地方存储了Polls数据,所以不需要更新其他文档。

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

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

    看一看。

    修改

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