【问题标题】:How to use a mongoose model in another model?如何在另一个模型中使用猫鼬模型?
【发布时间】:2022-02-18 21:47:42
【问题描述】:

我有以下两种型号。在用户模型中,我想使用请求数组,在请求模型中,我想将用户用作属性(没有密码)。我该怎么做?

var userSchema = new Schema({
  cartaoCidadao: {
    type: String,
    required: true,
    index: {
      unique: true,
    },
    match: /[0-9]{8}/,
  },
  password: { type: String, required: true },
  role: { type: String },

  estado: { type: String, enum: ["Infetado", "Suspeito"] },
});

var requestSchema = new Schema({
  encaminhado: { type: String },
  pessoaRisco: { type: String },
  trabalhoRisco: { type: String },
  estadoPedido: { type: String },
  resultado: { type: String },
});

【问题讨论】:

    标签: javascript node.js express mongoose model


    【解决方案1】:

    您可以使用您定义为类型本身的架构:

    var userSchema = new Schema({
        // ...
        requests: {
            type: [requestSchema] // this property type is: array of requests
        }
        // ...
    });
    

    如果两个模型都存储在数据库中,并且您可能想要关联它们。您可以从另一个模型中引用一个模型。 (见 Muhammad Lahin 的回答)

    然后您查询您的父模型并将子模型与其关联 (https://mongoosejs.com/docs/populate.html)

    下面是一个示例,说明如何在填充期间排除某些字段: https://mongoosejs.com/docs/populate.html#query-conditions

    会是这样的:

    User.
      find(/* some query */).
      populate({
        path: 'requests',
        select: 'fieldToSelect1 fieldToSelect2' // You can control which fields to include
      }).
      exec();
    

    【讨论】:

    • 但是如何隐藏密码?例如,如果用户请求进行测试,我不希望医生看到他的密码
    • 所以如果我想查看请求数据,我会做 Request.findOneByID({_id:id},(req,res,next){ find(user.id).populate({ path:user选择:cartaoCidadao,estado
    • 是的,这将获取您的请求实体并填充内部用户实体,如果应用选择 - 它只会在用户中包含指定的字段。
    【解决方案2】:

    你可以这样做

    var userSchema = new Schema({
        requests: [
            {
                type: Schema.Types.ObjectId,
                ref: "Request",
            }
        ]
    });
    
    var requestSchema = new Schema({
        user: {
            type: Schema.Types.ObjectId,
            ref: "User"
        }
    })
    

    【讨论】:

      【解决方案3】:

      你可以像这样在请求模型中设置用户的类型

        type: schema.Types.ObjectID,
        ref: 'users'
      

      哪些用户 id 用户的架构以及当您想在响应中发送整个用户数据时,请使用填充,在填充中您也可以省略密码

      现在,如果您在请求数据库中看到 mondodb 数据库,则不会保存整个用户对象,仅保存 user_id,因此您无权访问该用户。您必须发送另一个请求以从给定的 user_id 获取用户数据,这不好。解决方案是您按照我所说的设置架构,当您发送包含请求数据的响应时,使用填充将用户数据添加到响应中

      res.json({request: requests.find(//options to find a specified request).populate('users','name')})
      

      第一个参数是用户模型,第二个参数是用户模型的所需字段,例如这将返回用户的名称。您可以添加更多参数以添加除密码之外的所有参数

      【讨论】:

      • 我不明白填充部分
      • 我想我明白了。所以我存储用户ID。例如,当我想查看用户的请求时,我使用控制器中的填充方法,对吗?
      • 我无法添加多个属性
      • 您可以有多个填充,例如 ....populate().populate().populate()
      【解决方案4】:
      const mongoose = require('mongoose')
      
      const productSchema = new mongoose.Schema({
           user: {
                  type: mongoose.Types.ObjectId,
                  ref:  'User'
                 }
      });
      

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 1970-01-01
        • 2018-10-13
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2018-01-06
        • 2023-03-18
        相关资源
        最近更新 更多