31

このトピックに関する Q/A が stackoverflow にたくさんあるようですが、どこにも正確な答えが見つからないようです。

私が持っているもの:

Company モデルと Person モデルがあります。

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}};

必要なもの:

姓が「Robertson」の人が設立したすべての会社を検索します

私が試したこと:

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

次に、 Person は埋め込まれていないが参照されていると考えたので、 populate を使用してfounder-Personを入力し、「Robertson」の姓でfindを使用しようとしました

// 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
    });

Person の ID を文字列として使用して、引き続き会社を照会できます。しかし、あなたが理解できるように、それはまさに私が欲しいものではありません

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

3 に答える 3

48

MongoDB は結合をサポートしていないため、単一のクエリでこれを行うことはできません。代わりに、いくつかのステップに分割する必要があります。

// 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
    });
});
于 2013-10-15T12:56:35.593 に答える