Mongoose nested query on Model by field of its referenced model

为君一笑 提交于 2019-11-26 10:32:29

问题


It seems like there is a lot of Q/A\'s on this topic on stackoverflow, but I can\'t seem to find an exact answer anywhere.

What I have:

I have Company and Person models:

var mongoose = require(\'mongoose\');
var PersonSchema = new mongoose.Schema{
                        name: String, 
                        lastname: String};

// company has a reference to Person
var CompanySchema = new mongoose.Schema{
                        name: String, 
                        founder: {type:Schema.ObjectId, ref:Person}};

What I need:

Find all companies that people with lastname \"Robertson\" have founded

What I tried:

Company.find({\'founder.id\': \'Robertson\'}, function(err, companies){
    console.log(companies); // getting an empty array
});

Then I figured that Person is not embedded but referenced, so I used populate to populate founder-Person and then tried to use find with \'Robertson\' lastname

// 1. retrieve all companies
// 2. populate their founders
// 3. find \'Robertson\' lastname in populated Companies
Company.find({}).populate(\'founder\')
       .find({\'founder.lastname\': \'Robertson\'})
       .exec(function(err, companies) {
        console.log(companies); // getting an empty array again
    });

I still can query companies with Person\'s id as a String. But it\'s not exactly what I want as you can understand

Company.find({\'founder\': \'525cf76f919dc8010f00000d\'}, function(err, companies){
    console.log(companies); // this works
});

回答1:


You can't do this in a single query because MongoDB doesn't support joins. Instead, you have to break it into a couple steps:

// Get the _ids of people with the last name of Robertson.
Person.find({lastname: 'Robertson'}, {_id: 1}, function(err, docs) {

    // Map the docs into an array of just the _ids
    var ids = docs.map(function(doc) { return doc._id; });

    // Get the companies whose founders are in that set.
    Company.find({founder: {$in: ids}}, function(err, docs) {
        // docs contains your answer
    });
});



回答2:


In case anyone comes across this in more recent times, Mongoose now supports join like functionality with a feature called Populate.

From the Mongoose documentation:

Story.findOne({ 
    title: 'Casino Royale' 
}).populate('author').exec(function (err, story) {
    if (err) return handleError(err);
    console.log('The author is %s', story.author.name);
    // prints "The author is Ian Fleming"
});

http://mongoosejs.com/docs/populate.html



来源:https://stackoverflow.com/questions/19380738/mongoose-nested-query-on-model-by-field-of-its-referenced-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!