Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose find result and then replace field with findOne

I am new to mongodb and come from relational database, and without join it's kind pain for me to go on with mongodb.

What i want to archive here is getting all the projects and update the projectType with proper project type name rather with project type id. Somehow the projects.attrubtes just can't be overwrite. then i tried the following post. with no luck. any help is appreciated. anyone can give me some guide would be much appreciated.

Why can't you modify the data returned by a Mongoose Query (ex: findById)

var _ = require('lodash');
var project = require('./project.model');
var Form = require('../form/form.model');

// Get list of projects
exports.index = function(req, res) {
  project.find(function (err, projects) {
    if(err) { return handleError(res, err); }

    _.each(projects, function(element, index){
      Form.findOne({_id : projects[index].projectType}, '-formContent -_id -createdDateTime', function(error, form){

        if(form !== undefined) projects[index].projectType = form.formName;
      });
    });

    return res.json(200, projects);
  }).sort({ createdDateTime: 'desc' });
};
like image 599
Bill Avatar asked Dec 05 '25 10:12

Bill


1 Answers

Mongoose documents don't allow adding properties. You need to either call the lean() method before exec() as documents returned from queries with the lean option enabled are plain javascript objects or cast the returned document to a plain object:.

From the docs:

project.find().lean().exec(function (err, projects) {
    projects[0] instanceof mongoose.Document // false
});

So your code should look like:

project.find()
    .lean()
    .exec(function (err, projects) {
        if(err) { return handleError(res, err); }

        _.each(projects, function(element, index){
            Form.findOne(
                {_id : projects[index].projectType}, 
                '-formContent -_id -createdDateTime', 
                function(error, form){
                    if(form !== undefined) projects[index].projectType = form.formName;
                }
            );
        });

        return res.json(200, projects);
    }).sort({ createdDateTime: 'desc' });

or cast the returned document to a plain object:

project.find()
    .exec(function (err, docs) {
        if(err) return res.send(err);
        var projects = [];
        _.each(docs, function(item, i) {
            var obj = item.toObject();
            Form.findOne(
                {_id : docs[i].projectType}, /* {_id : item.projectType} */
                '-formContent -_id -createdDateTime', 
                function(error, form){
                    if(form !== undefined) {
                        obj.projectType = form.formName;
                        projects.push(obj);
                    }
                }
            );
        });

        res.send(projects); 
    });
like image 169
chridam Avatar answered Dec 07 '25 11:12

chridam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!