Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 子文档与猫鼬种群_Node.js_Mongodb_Mongoose_Crud - Fatal编程技术网

Node.js 子文档与猫鼬种群

Node.js 子文档与猫鼬种群,node.js,mongodb,mongoose,crud,Node.js,Mongodb,Mongoose,Crud,我有以下几点意见: 用户可以登录到网站。用户可以添加/删除投票(一个有两个选项的问题)。任何用户都可以通过选择其中任何一个选项对投票发表意见 考虑到上述场景,我有三种模型-用户轮询选项。按照依赖关系的顺序,它们如下所示: 选项模式 轮询模式 用户架构:父架构 我如何实现这些文档之间的上述关系。猫鼬的数量是多少?它与子文档有何不同?我应该选择子文档还是使用Mongoose填充。因为MongoDb没有连接作为关系数据库,所以填充类似于隐藏连接。这只是意味着,当您拥有该用户模型并将填充投票模型时,mo

我有以下几点意见:

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

考虑到上述场景,我有三种模型-
用户
轮询
选项
。按照依赖关系的顺序,它们如下所示:

选项模式

轮询模式

用户架构:父架构


我如何实现这些文档之间的上述关系。猫鼬的数量是多少?它与子文档有何不同?我应该选择子文档还是使用Mongoose填充。

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

  • 获取用户
  • 通过存储在用户文档中的objectid获取相关的轮询
  • 将获取的轮询文档放入用户文档
  • 当您将用户设置为文档并将轮询设置为子文档时,这只意味着您将把整个数据放在单个文档中。一方面,这意味着要获取用户轮询,mongoose不需要运行两个查询(它只需要获取用户文档,因为轮询数据已经存在)

    但选择什么更好呢?这取决于具体情况。 如果您的投票文件将在其他文件中引用(您需要从documents User、A、B、C访问轮询-填充它可能更好,但不确定。填充的优点是,当您需要更改某些轮询字段时,您不需要更改引用该轮询文档的每个文档中的数据(因为它将是一个子文档)-在这种情况下,在文档用户A、B、C中-您将只更新轮询文档。正如您所看到的,这很好。我告诉过您,在这种情况下,不确定填充是否会更好,因为我不知道您需要如何检索轮询数据。如果您以错误的方式存储数据,您将遇到性能问题或在轻松获取数据时遇到一些问题

    子文档是存储数据的基本方式。当轮询只针对用户时,这非常好。这有性能优势-mongoose需要执行一次查询,而不是像在人口中那样执行两次查询,并且没有以前提醒过的更新缺点,因为您只在一个位置存储轮询数据,因此不需要更新其他文档恩茨

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

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

    看看这个

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

    如果您有一些问题,请继续-请在下面回答。如果对您有帮助,我将感谢您的费率;)谢谢你的解释。这很有帮助。希望,有了经验我会理解得更好。
    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]
    });