Home > database >  Cannot Populate path in Mongoose while trying to join two documents
Cannot Populate path in Mongoose while trying to join two documents

Time:09-22

MongooseError: Cannot populate path loaned_to because it is not in your schema. Set the strictPopulate option to false to override.

I've tried to join two documents in mongodb using mongoose in nodejs, But unfortunately this error occurs. My mongoose version is 6.0.6

Book Schema

const mongoose = require('mongoose');

const BookSchema = new mongoose.Schema({
    "name": {type: String, required: true},
    "author_name": {type: String, required: true},
    "published_date": {type: Date, required: false},
    "copies": [
        {
            "isbn_number": {type: String, required: true},
            "status": {type: String, required: true, default: "Available"},
            "due_back": {type: Date, required: false},
            "loaned_to": {type: mongoose.Schema.Types.ObjectId, required: false, ref: "User"}
        },
    ]
})

const Book = mongoose.model("Book", BookSchema);
module.exports = Book;

User Schema

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
    "first_name": {type: String, required: true},
    "last_name": {type: String, required: true},
    "phone_number": {type:  String, required: true},
    "address": {type:  String, required: false},
    "user_name":{type: String, required: true},
    "password": {type:  String, required: true},
    "email": {type:  String, required: true},
    "notifications": [
        {
            "notification_id" : {type:"string", required:true},
            "notification": {type: "string", required: true}
        },
    ]
})

const User = mongoose.model("User", UserSchema);
module.exports = User;

My code to join documents

exports.getAllBooks = async (req, res) => {
    try {
        let data = await BookModel.findOne().populate("loaned_to");
        res.status(200).send({data: [...data], success: true})
    } catch (err) {
        console.log(err)
        res.status(404).send({success: false, msg: err.message})
    }
}

CodePudding user response:

exports.getAllBooks = async (req, res) => {
  try {
    let data = await BookModel.findOne().populate({
      path: 'copies.loaned_to',
      select:
        'first_name lastName phone_number address user_name email notifications',
    });
    res.status(200).json({ data: [...data], success: true });
  } catch (err) {
    console.log(err);
    res.status(500).json({ success: false, msg: err.message });
  }
};
  • Related