Search code examples
node.jsmongodbexpressmongoosepopulate

i dont know why mongoose populater return null?


I'm sorry that I can't speak English.

Here are two schemas and one query.

/models/user_schema

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const { Schema } = mongoose;
const userSchema = new Schema({
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        unique: true,
        index: true,
        auto: true,
        required: true,
    },
    email: {
        type: String,
        required: true,
    },
    nickName: {
        type: String,
        required: true,
    },
    userName: {
        type: String,
        required: true,
    },
    password: {
        type: String,
        required: true,
    },
    profile_img: {
        type: String,
    },
    day: {
        type: Date,
        default: Date.now,
        required: true,
    },
});

/* bcrypt를 사용한 패스워드 암호화 */
userSchema.pre('save', function (next) {
    const user = this;
    const saltFactor = 10;
    bcrypt.genSalt(saltFactor, (err, salt) => {
        // Salt 생성
        if (err) {
            return next(err);
        }

        bcrypt.hash(user.password, salt, (err, hash) => {
            // Hash생성
            if (err) {
                return next(err);
            }
            user.password = hash; // Hash값 pwd에 저장
            next();
        });
    });
});

module.exports = mongoose.model('user', userSchema);

/models/board_schema

const mongoose = require('mongoose');

const { Schema } = mongoose;
const boardSchema = new Schema({
    boardId: {
        type: mongoose.Schema.Types.ObjectId,
        unique: true,
        index: true,
        auto: true,
        required: true,
    },
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'user',
        required: true,
    },
    contents: {
        type: String,
        required: true,
    },
    img: {
        type: String,
        required: true,
    },
    like: {
        type: Number,
        default: 0,
    },
    day: {
        type: Date,
        default: Date.now,
        required: true,
    },
});

module.exports = mongoose.model('board', boardSchema);

my query

const board = require('../../../models/schema/board_schema');
const user = require('../../../models/schema/user_schema');
module.exports = {
    async selectMainBoard() {
        const boardAll = await board
            .find()
            .populate('userId')
            .exec(function (err, board) {
                console.log(board);
            });

        return boardAll;
    },
};

query return

  {
    boardId: 606d5ed4c8bfe6118433ee83,
    like: 0,
    _id: 606d5ed4c8bfe6118433ee84,
    userId: null,
    contents: '안녕~!',
    img: 'https://99instabucket.s3.ap-northeast-2.amazonaws.com/1617780435994.JPG',
    day: 2021-04-07T07:27:16.169Z,
    __v: 0
  }

i dont know why mongoose populater userId return null?

I thought populate was join, but the populate does not give userId data.

I don't understand when I study nosql for the first time.

Can you tell me where I did wrong?


Solution

  • I write the answer here as well:

    In the documentation https://mongoosejs.com/docs/populate.html#saving-refs the userId should be declared as _id: new mongoose.Types.ObjectId()