猫鼬填充未填充必填字段

Posted

技术标签:

【中文标题】猫鼬填充未填充必填字段【英文标题】:mongoose populate not populating the required field 【发布时间】:2021-05-06 15:17:35 【问题描述】:

我已经尝试了几天尝试使用生物数据架构值填充用户文档。

我一直只获取用户数据,而不是两种模式的组合。

以下是我一直在使用的代码。

这些是模型:

   const mongoose = require('mongoose') 
   const Schema = mongoose.Schema;

这是猫鼬插件

    const passportLocalMongoose = require('passport-local-mongoose')

用户架构

    const UserSchema = new Schema(
         email:  type: String, unique: true, required: true,
         bios: 
             type: mongoose.Schema.Types.ObjectId,
             ref: 'Bio'
         ,
         username: String,
         level: String,
         resetPasswordToken: String,
         resetPasswordExpires: Date
       );

生物数据架构

    const BioSchema = new Schema(
         address: String,
         age: Number,
         gender: String,
         user: 
             type: mongoose.Schema.Types.ObjectId,
             ref: 'User'
         ,
       );

使用插件

    UserSchema.plugin(passportLocalMongoose, usernameField: 'email')

为模式建模

    const User = mongoose.model('User', UserSchema, 'user');
       const Bio = mongoose.model('Bio', BioSchema, 'bio');
      module.exports =   User, Bio

这些是控制器:

    const User, Bio = require('../models/users');
    
       module.exports =   

用户注册回调函数

    signup: async (req, res, next)=>
                   await User.register(new User(req.body), req.body.password).then(user=>
                     req.login(user, function(err)
                        if(err) return next(err);
                          )

生物数据回调函数


   postUserDetails: async (req, res, next)=>
             const newBio = new Bio(
               address: req.body.address,
               age: req.body.age,
               gender: req.body.gender,
             )
             await newBio.save().then(result=>
               console.log(result)
               res.redirect('/')
             ).catch(err=>
               console.log(err))
           ,

获取请求填充回调函数


    getUserDetails: async(req, res, next)=>
          await User.findOne(_req.params._id).populate("bios").then(result=> res.json(result)).catch(err=> console.log(err))
        ,
        

我没有得到填充字段,bios。我只获取用户数据作为回报。

请有人帮忙。

【问题讨论】:

【参考方案1】:

试试findOne()

getUserDetails: async(req, res, next)=>
      await User.findOne(_req.params._id).populate("bios").then(result=> res.json(result)).catch(err=> console.log(err))
    ,
    

findById() 不带

getUserDetails: async(req, res, next)=>
      await User.findById(_req.params._id).populate("bios").then(result=> res.json(result)).catch(err=> console.log(err))

【讨论】:

【参考方案2】:

您的 user 文档(您在上一个 sn-p 中查询的文档)是否设置了 bios 值,如果有,是否存在具有确切 _id 值的 bio 文档?

【讨论】:

是的,它确实有一个 'bios' 值。我的问题可能是@rokob,将设置“_id”值。我很困惑如何去做。我想可能会在登录后自动设置。

以上是关于猫鼬填充未填充必填字段的主要内容,如果未能解决你的问题,请参考以下文章

仅填充猫鼬中的特定字段

只有当字段包含 ObjectId 时,是不是可以让猫鼬填充混合字段?

猫鼬模型在填充后获得未定义的属性

如何通过填充字段在猫鼬中查找文档?

如何通过填充字段在猫鼬中查找文档?

如何在猫鼬的嵌入式文档中填充字段?