Skip to content
Advertisement

I am trying to use populate in mongodb with nodejs, but values are not populating

const dbConfig = require("../config/config.js");
const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
const db = {};
db.mongoose = mongoose;
db.url = dbConfig.url;
db.users = require("./users.model.js")(mongoose);
db.listservices = require("./listservices.model.js")(mongoose);
db.services = require("./services.model.js")(mongoose);
db.reviewservices = require("./reviewservices.model.js")(mongoose);
module.exports = db;

listservices.model.js

module.exports = mongoose => {
    const Listservices = mongoose.model(
        "listservices",
        mongoose.Schema(
            {
                type: String,
                services_name: String,
                image: String,
                active: Boolean,
                services: [{
                    type: mongoose.Schema.Types.ObjectId,
                    ref: 'Services'
                }]
            },
            { timestamps: true }
        )
    );


    return Listservices;
};

Services.model.js

```module.exports = mongoose => {
    // const Listservices = require('./listservices.controller');

    const Services = mongoose.model(
        "services",
        mongoose.Schema(
            {
                name: String,
                description: String,
                otherdetails: String,
                location: String,
                coordinate: Array,
                photos: Array,
                service_provided: String,
                verified_by: Array,
                closed: Boolean,
                active: Boolean,
                servicescategories: {
                    type: mongoose.Schema.Types.ObjectId,
                    ref: 'listservices'
                },
                reviewservices: [{
                    type: mongoose.Schema.Types.ObjectId,
                    ref: 'reviewservices'
                }],
            },
            { timestamps: true }
        )
    );
    return Services;
};
Controller

exports.findAll = (req, res) => { const services = req.query.services; var condition = services ? { services: { $regex: new RegExp(services), $options: “i” } } : {}; Services.find(condition ).populate(‘servicescategories’)

    .then(data => {
        res.send(data);
        console.log(data);
    })
    .catch(err => {
        res.status(500).send({
            message:
                err.message || "Some error occurred while retrieving services."
        });
    });

};

The output is showing id, but not fetching the data from the other collection

[{“_id”:”60a27c66d87174379c93d7b5″,”name”:”MY data name”,”closed”:false,”active”:false,”listservices”:”60a2606680405c41c05cf005″,”createdAt”:”2021-05-17T14:23:34.412Z”,”updatedAt”:”2021-05-17T14:23:34.412Z”,”__v”:0}]

Thanks in advance

Advertisement

Answer

You are trying to use different name in your controller, populate receives 4 parameters- path, selection(fields to be return) , condition, options (like {limit:10}):

exports.findAll = (req, res) => {
    const services = req.query.services;
    var condition = services ? { services: { $regex: new RegExp(services), $options: "i" } } : {};
    Services.find().populate({path: 'servicescategories', select: 'services_name'}) // put correct name here
        .then(data => {
            res.send(data);
            console.log(data);
        })
        .catch(err => {
            res.status(500).send({
                message:
                    err.message || "Some error occurred while retrieving services."
            });
        });
};


Advertisement