Justin Young
Justin Young

Reputation: 2463

find subdocument without start from parent

Pretty new to mongoose. Can I findOne off of a subdocument model?

I have a subdoc called deliverables which is a child of projects

What I'd like to do is FIND on my deliverables model so I don't have to find on the project as

{project.child.child.child.deliverables._id: req.id}

Is that possible or do I have to start from the project model each time? Below is a sample setup I'm using along with my example findOne.

    'use strict';

//////////////model/////////////////
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
  var deliverablesSchema = new Schema({
    title:{
        type:String,
    }
 })
var ProjectSchema = new Schema({
    name: {
        type: String,
    },
    deliverables: [deliverablesSchema],

});
mongoose.model('Deliverable', deliverablesSchema);
mongoose.model('Project', ProjectSchema);


//////////////controller/////////////////
var mongoose = require('mongoose'),
Project = mongoose.model('Project'),
Deliverable = mongoose.model('Deliverable'),
_ = require('lodash');


exports.findDeliverable = function(req, res) { 
    Deliverable.findOne({'_id': req.params.deliverableId}).exec(function(err, deliverable) {
        if(deliverable){
            //return
        }
    });
};

Upvotes: 0

Views: 480

Answers (2)

Justin Young
Justin Young

Reputation: 2463

Kept digging and found this: https://stackoverflow.com/a/28952991/2453687

You still have to pull the master document first but it's easy to drill down to the particular object you're looking for and make a quick update, then just update the whole master document in one shot.

Dead simple. Works like a charm.

Upvotes: 0

vorillaz
vorillaz

Reputation: 6276

You can find subdocuments within a document only if you have declared their schema http://mongoosejs.com/docs/subdocs.html

Here is an example taken from here:

Project.findOne({
    '_id': myid
}).exec(function (err, p) {
    if (p) {
        //return
        var deriv = p.deliverables.filter(function (oneP) {
            return oneP._id === 'myderivableid';
        }).pop();
    }
});

If your subdocuments are just nested objects in an array you may use Lodash to retrieve that data using _ .where or _.find

Upvotes: 2

Related Questions